• 小白学 Python 数据分析(6):Pandas (五)基础操作(2)数据选择


    人生苦短,我用 Python

    前文传送门:

    小白学 Python 数据分析(1):数据分析基础

    小白学 Python 数据分析(2):Pandas (一)概述

    小白学 Python 数据分析(3):Pandas (二)数据结构 Series

    小白学 Python 数据分析(4):Pandas (三)数据结构 DataFrame

    小白学 Python 数据分析(5):Pandas (四)基础操作(1)查看数据

    引言

    上一篇文章我们介绍如何在 Pandas 一些基础的查看数据的操作,但是官方更推荐我们使用 .at.iat.loc.iloc 这几个经过 Pandas 优化过的数据访问方法来访问数据。

    首先我们还是先创建一个 DataFrame 用作演示,小编偷懒,接着把上一篇的 DataFrame 拷贝过来了,如下:

    import numpy as np
    import pandas as pd
    
    dates = pd.date_range('20200101', periods=6)
    df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
    print(df)
    

    DataFrame 是由很多列组成的,其实可以看做是由多个 Series 组成,我们可以单独获取一列直接获得一个 Series ,如下:

    # 获取单列,获得 Series
    print(df['A'])
    
    # 输出结果
    2020-01-01   -0.065477
    2020-01-02   -1.089716
    2020-01-03    0.049215
    2020-01-04   -0.017615
    2020-01-05   -0.910402
    2020-01-06   -0.008887
    Freq: D, Name: A, dtype: float64
    

    接下来我们可以通过 [] 对 DataFrame 进行切片操作,示例如下:

    # 行切片
    print(df[0:3])
    print(df['20200101' : '20200103'])
    
    # 输出结果
                       A         B         C         D
    2020-01-01 -0.065477  1.603827  1.152969  0.742842
    2020-01-02 -1.089716 -0.540936  0.456917  0.295272
    2020-01-03  0.049215 -1.182454 -0.294177 -0.698877
                       A         B         C         D
    2020-01-01 -0.065477  1.603827  1.152969  0.742842
    2020-01-02 -1.089716 -0.540936  0.456917  0.295272
    2020-01-03  0.049215 -1.182454 -0.294177 -0.698877
    

    可以看到,我们通过整数或者是 columns 将 DataFrame 进行了行切片。

    loc

    我们可以通过使用 loc 进行 column 名和 index 名定位。

    比如我们通过 column 提取出一行数据,如下:

    # 用标签提取一行数据
    print(df.loc[dates[0]])
    
    # 输出结果
    A   -0.065477
    B    1.603827
    C    1.152969
    D    0.742842
    Name: 2020-01-01 00:00:00, dtype: float64
    

    注意,这里的 dates 是我们在最前面生成的一个数组,这里的写法同样可以替换成 df.loc['20200101']

    同样我们可以通过切片的方式获取指定某几行的数据,如下:

    # 用标签提取多列数据
    print(df.loc[:, ['A', 'B']])
    
    # 输出结果
                       A         B
    2020-01-01 -0.065477  1.603827
    2020-01-02 -1.089716 -0.540936
    2020-01-03  0.049215 -1.182454
    2020-01-04 -0.017615 -0.777637
    2020-01-05 -0.910402 -0.173959
    2020-01-06 -0.008887  0.525035
    
    # 用标签进行切片操作,同时制定行与列的结束点
    print(df.loc['20200101':'20200103', ['A', 'B']])
    
    # 输出结果
                       A         B
    2020-01-01 -0.065477  1.603827
    2020-01-02 -1.089716 -0.540936
    2020-01-03  0.049215 -1.182454
    
    # 返回一行中的两列
    print(df.loc['20200101', ['A', 'B']])
    
    # 输出结果
    A   -0.065477
    B    1.603827
    Name: 2020-01-01 00:00:00, dtype: float64
    

    那么我如果想获得一个指定位置的数据怎么办呢?当我们把 DataFrame 想像成为一个坐标系的时候,当然是指定横纵坐标可以确定一个唯一的点啊,如下:

    # 获取某个标量值
    print(df.loc[dates[0], 'A'])
    
    # 输出结果
    -0.06547653622759132
    

    iloc

    iloc 和上面的 loc 很像, loc 主要是通过行进行索引定位,而 iloc 是通过 index 也就是列进行索引定位,所以参数是整型, iloc 的英文全称为 index locate 。

    先看一个简单的示例,我们先用整数选择出其中的一列:

    # 用整数位置选择
    print(df.iloc[3])
    
    # 输出结果
    A   -0.017615
    B   -0.777637
    C    0.824364
    D    0.210244
    Name: 2020-01-04 00:00:00, dtype: float64
    

    这里我们还可以加上切片进行选择:

    # 使用整数按行和列进行切片操作
    print(df.iloc[3:5, 0:2])
    
    # 输出结果
                       A         B
    2020-01-04 -0.017615 -0.777637
    2020-01-05 -0.910402 -0.173959
    
    # 用整数列表按位置切片
    print(df.iloc[[1, 2, 4], [0, 2]])
    
    # 输出结果
                       A         C
    2020-01-02 -1.089716  0.456917
    2020-01-03  0.049215 -0.294177
    2020-01-05 -0.910402 -1.140222
    
    # 整行切片
    print(df.iloc[1:3, :])
    
    # 输出结果
                       A         B         C         D
    2020-01-02 -1.089716 -0.540936  0.456917  0.295272
    2020-01-03  0.049215 -1.182454 -0.294177 -0.698877
    
    # 整列切片
    print(df.iloc[:, 1:3])
    
    # 输出结果
                       B         C
    2020-01-01  1.603827  1.152969
    2020-01-02 -0.540936  0.456917
    2020-01-03 -1.182454 -0.294177
    2020-01-04 -0.777637  0.824364
    2020-01-05 -0.173959 -1.140222
    2020-01-06  0.525035 -1.076101
    

    同样,我们通过 iloc 也可以直接选择一个标量值:

    # 获取某个标量值 同上
    print(df.iloc[1, 1])
    
    # 结果如下
    -0.540936460611594
    

    at 和 iat

    at 和 iat 都是用来访问单个元素的,而且他们的访问速度要快于上面的 loc 和 iloc 。

    at 使用方法与 loc 类似,示例如下:

    print(df.at[dates[0], 'A'])
    
    # 输出结果
    -0.06547653622759132
    

    iat 对于 iloc 的关系就像 at 对于 loc 的关系,示例如下:

    print(df.iat[1, 1])
    
    # 输出结果
    -0.540936460611594
    

    其他

    我们还可以使用一些判断条件来选择数据,如用单列的值选择数据,示例如下:

    print(df[df.A > 0])
    
    # 输出结果
                       A         B         C         D
    2020-01-03  0.049215 -1.182454 -0.294177 -0.698877
    

    上面这个示例是输出的所有 A 列大于 0 的数据。

    还有直接使用整个 df 做判断的,示例如下:

    print(df[df < 0])
    
    # 输出结果
                       A         B         C         D
    2020-01-01 -0.065477       NaN       NaN       NaN
    2020-01-02 -1.089716 -0.540936       NaN       NaN
    2020-01-03       NaN -1.182454 -0.294177 -0.698877
    2020-01-04 -0.017615 -0.777637       NaN       NaN
    2020-01-05 -0.910402 -0.173959 -1.140222 -0.662615
    2020-01-06 -0.008887       NaN -1.076101 -0.862407
    

    示例代码

    老规矩,所有的示例代码都会上传至代码管理仓库 Github 和 Gitee 上,方便大家取用。

    示例代码-Github

    示例代码-Gitee

    参考

    https://www.pypandas.cn/docs/getting_started/10min.html

  • 相关阅读:
    Google Web 字体 API 访谈
    关于如何跨越抄袭程序阶段的一些断想
    DirectX开发中找不到dxtrans.h的问题的解决
    Google Web 字体 API 访谈
    NetBeans 6.9 发布后选版 1 已经可用
    Thrift java服务器与客户端示例
    Wing IDE Pro v. 4.1.91 Python Wingware Python IDE
    tkang's blog
    Thrift的简单使用
    maven加载自己的包
  • 原文地址:https://www.cnblogs.com/babycomeon/p/12340466.html
Copyright © 2020-2023  润新知