Pandas 下标存取操作

作者: wikizero | 来源:发表于2017-09-05 23:21 被阅读2160次

    Pandas对数据的获取封装了大量的方法,主要包括.loc[], .iloc[], .at[], iat[], .ix[]以及[]操作符, 下面例子主要是展示了如何使用它们。

    df = pd.DataFrame(data=[['Alice', 'girl', 18, 171],
                           ['Bob', 'boy', 19, 172],
                           ['Tom', 'boy', 17, 173],
                           ['Lucy', 'girl', 18, 172]],
                        columns=['Name', 'Sex', 'Age', 'Class'],
                        index=['A', 'B', 'C', 'D'])
    

    下面的操作都基于以上数据集。
    一、 []操作符
    1、单个索引标签:获取标签所在的列,返回一个Series对象。

    print df['Name'] # 或者 df.Name
    
    output:
    A Alice
    B Bob
    C Tom
    D Lucy
    Name: Name, dtype: object
    

    2、多个索引标签:获取多列,返回一个DataFrame对象。

    print df[['Name', 'Age']]
    
    output:
    Name Age
    A Alice 18
    B Bob 19
    C Tom 17
    D Lucy 18
    

    3、整数切片:以整数下标获取切片对应的行。

    print df[1:3]
    
    output:
    Name Sex Age Class
    B Bob boy 19 172
    C Tom boy 17 173
    

    4、标签切片:获取多行。

    print df['B':'C'] # 注意:'C'行也会被截取进来
    
    output:
    Name Sex Age Class
    B Bob boy 19 172
    C Tom boy 17 173
    

    5、布尔数组:获取数组中True对应的行。

    print df['Age'] >= 18 # 这是一个布尔序列
    
    output:
    A True
    B True
    C False
    D True
    Name: Age, dtype: bool
    
    print df[df['Age'] >= 18]
    
    output:
    Name Sex Age Class
    A Alice girl 18 171
    B Bob boy 19 172
    D Lucy girl 18 172
    

    6、布尔DataFrame:将DataFrame对象中False对应的元素设置为NaN。

    print df == 18 # 这是一个布尔DataFrame对象 
    (注意:df不能直接进行非数值比较,如:df == 'Alice' 错误)
    
    output:
    Name Sex Age Class
    A False False True False
    B False False False False
    C False False False False
    D False False True False
    
    print df[df == 18]
    
    output:
    Name Sex Age Class
    A NaN NaN 18.0 NaN
    B NaN NaN NaN NaN
    C NaN NaN NaN NaN
    D NaN NaN 18.0 NaN
    

    二、.loc[]、.iloc[]和.ix[]存取器
    1、.loc[] (.loc[行索引/切片, 列索引/切片])

    print df.loc['A'] # 获取'A'行
    print df.loc[['A', 'B']] # 获取'A'、'B'两行
    print df.loc['A', 'Name'] # 行列定位(获取一个元素)
    
    print df.loc['A':'C', 'Name':'Age'] # 行列切片
    
    output:
    Name Sex Age
    A Alice girl 18
    B Bob boy 19
    C Tom boy 17
    
    print df.loc[df['Age'] > 18] # 行过滤
    
    output:
    Name Sex Age
    B Bob boy 19
    
    print df.loc[df['Age'] >= 18, ['Name', 'Sex', 'Age']] # 行列过滤
    
    output:
    Name Sex Age
    A Alice girl 18
    B Bob boy 19
    D Lucy girl 18
    
    print df.loc[:, df.columns.str.contains('e')] # 根据列名过滤
    
    output:
    Name Sex Age
    A Alice girl 18
    B Bob boy 19
    C Tom boy 17
    D Lucy girl 18
    

    2、.iloc[] (与.loc[]类似,只是其使用的是整数下标)

    print df.iloc[:, [0, 3]] # 行列过滤:获取所有行, 第一、第四列
    
    output:
    Name Class
    A Alice 171
    B Bob 172
    C Tom 173
    D Lucy 172
    

    3、.ix[] 是混用了标签和整数下标,也就是结合了.col[]与.icol[]的功能

    print df.ix[:3, ['Name', 'Sex', 'Age']] # 行列过滤
    
    output:
    Name Sex Age
    A Alice girl 18
    B Bob boy 19
    C Tom boy 17
    

    三、获取单个值
    1、.at[]与.iat[] 分别是使用标签和整数下标来获取单个值

    print df.at['A', 'Name']
    print df.iat[0, 0] # 操作结果与上面是一样的 
    
    output:
    Alice
    

    2、.get_value()与.at[]类似

    print df.get_value('B', 'Name')
    
    output:
    Bob
    

    3、.lookup() 获取指定元素数组

    print df.lookup(['A','B'], ['Name', 'Age'])
    
    output:
    ['Alice' 19]
    

    四、利用query()方法筛选数据

    print df.query('Age >= 19 and Class == 172') 
    # 其实上面操作等价于: df[(df.Age >= 19) & (df.Class == 172)]
    
    output:
    Name Sex Age Class
    B Bob boy 19 172
    
    query()的参数是一个运算表达式字符串,使用not、and、or关键字进行布尔运算,表达式中的变量名表示与其对应的列,表达式中还支持变量的使用:
    age = 19
    print df.query('Age >= @age and Class == 172')
    

    相关文章

      网友评论

        本文标题:Pandas 下标存取操作

        本文链接:https://www.haomeiwen.com/subject/voopjxtx.html