DataFrame数据筛选_下
这将是DataFrame数据筛选的最后一篇文章,重点介绍的是3对函数的使用:
- iloc和loc,最为重要,经常使用的一对函数
- at和iat
- any和all
重要学习资料:Pandas官网
扩展阅读
Pandas取数的方法真的是五花八门,有很多的函数和技巧需要我们去掌握和自己平时积累。之前的2篇文章分别是:
模拟数据
本文中模拟了两份数据:
- 第一份的索引为字符类型
- 第二份的索引使用的是默认数值型
1 | import pandas as pd |
1 | # 第一份模拟数据df0 |
1 | # 第二份模拟数df |
iloc和loc
iloc是通过数值来进行筛选,loc是通过属性或者行索引名来进行筛选
iloc
直接指定数值,取出单行记录
1 | # 1、使用数值 |
使用冒号表示全部
1 | df1 = df.iloc[1,:] # :冒号表示全部 |
还可以使用切片来取数:
1 | df1 = df.iloc[:3] # 取出前3行记录 |
取出非连续的多行记录:
1 | df2 = df.iloc[[1,2,4]] # 取出多行记录 |
name | sex | age | score | address | |
---|---|---|---|---|---|
1 | 小王 | 女 | 23 | 600.0 | NaN |
2 | 张菲 | 女 | 18 | 550.0 | 湖南省长沙市雨花区 |
4 | 孙小小 | 女 | 25 | 610.0 | 广东省广州市白云区 |
1 | # 2、取出行记录的部分列属性 |
1 | # 列方向上使用切片,步长为2 |
1 | # 行索引为2,列索引号为1 和 3 |
1 | # 3、取出具体的值 |
在行和列方向上同时使用切片,还可以指定步长:
1 | # 4、行和列方向同时使用切片 |
和原数据进行对比一下:
!!!一个非常有用的方法:np.r_,帮助我们取出非连续的列属性
1 | # 5、取出不连续的行列数据,使用np.r_ |
name | age | score | |
---|---|---|---|
0 | 小明 | 20 | NaN |
1 | 小王 | 23 | 600.0 |
2 | 张菲 | 18 | 550.0 |
3 | 关宇 | 21 | NaN |
4 | 孙小小 | 25 | 610.0 |
5 | 王建国 | 21 | 580.0 |
6 | 刘蓓 | 24 | 634.0 |
1 | df9 = df.iloc[np.r_[0,2:4],:] |
name | sex | age | score | address | |
---|---|---|---|---|---|
0 | 小明 | 男 | 20 | NaN | 广东省深圳市南山区 |
2 | 张菲 | 女 | 18 | 550.0 | 湖南省长沙市雨花区 |
3 | 关宇 | 男 | 21 | NaN | 北京市东城区 |
loc
使用的行索引名或者列属性直接来取数
1 | # 1、取出单个列 |
0 小明
1 小王
2 张菲
3 关宇
4 孙小小
5 王建国
6 刘蓓
Name: name, dtype: object
1 | # 2、取数多个列 |
1 | # 3、使用数值,取出第一行,索引为0 |
1 | # 4、取出索引为0,1,3的行记录,此时列字段是全部保留 |
1 | # 使用冒号:,表示全部列,效果同上 |
1 | # 5、取出部分行和部分列 |
1 | # 6、!!!使用索引切片:同时包含起止位置 |
1 | df.loc[:] # 表示所有数据 |
1 | # 7、列筛选的时候,必须有行元素 |
name | score | |
---|---|---|
0 | 小明 | NaN |
1 | 小王 | 600.0 |
2 | 张菲 | 550.0 |
3 | 关宇 | NaN |
4 | 孙小小 | 610.0 |
5 | 王建国 | 580.0 |
6 | 刘蓓 | 634.0 |
1 | # 所有行的age及后面全部列 |
age | score | address | |
---|---|---|---|
0 | 20 | NaN | 广东省深圳市南山区 |
1 | 23 | 600.0 | NaN |
2 | 18 | 550.0 | 湖南省长沙市雨花区 |
3 | 21 | NaN | 北京市东城区 |
4 | 25 | 610.0 | 广东省广州市白云区 |
5 | 21 | 580.0 | 湖北省武汉市江夏区 |
6 | 24 | 634.0 | 广东省深圳市龙华区 |
1 | # 8、部分行,age及其后面的全部列 |
age | score | address | |
---|---|---|---|
1 | 23 | 600.0 | NaN |
2 | 18 | 550.0 | 湖南省长沙市雨花区 |
3 | 21 | NaN | 北京市东城区 |
1 | # 9、针对非数值型行索引的取数 |
小明 101
小红 102
小孙 140
Name: 语文, dtype: int64
1 | # 10、注意两个方括号取出的是DataFrame数据,单个括号是Series型数据 |
小明 | 小红 | 小孙 | |
---|---|---|---|
语文 | 101 | 102 | 140 |
1 | df0.loc[["语文","英语"]] |
小明 | 小红 | 小孙 | |
---|---|---|---|
语文 | 101 | 102 | 140 |
英语 | 87 | 128 | 117 |
1 | # 11、取出部分行和列数据 |
1 | df0.loc[["语文","英语"],["小明","小孙"]] |
小明 | 小孙 | |
---|---|---|
语文 | 101 | 140 |
英语 | 87 | 117 |
1 | # 12、直接使用行索引名来取数 |
小明 | 小红 | 小孙 | |
---|---|---|---|
语文 | 101 | 102 | 140 |
英语 | 87 | 128 | 117 |
两者对比
1 | df.loc[[1,2]] |
name | sex | age | score | address | |
---|---|---|---|---|---|
1 | 小王 | 女 | 23 | 600.0 | NaN |
2 | 张菲 | 女 | 18 | 550.0 | 湖南省长沙市雨花区 |
1 | df.iloc[[1,2]] |
name | sex | age | score | address | |
---|---|---|---|---|---|
1 | 小王 | 女 | 23 | 600.0 | NaN |
2 | 张菲 | 女 | 18 | 550.0 | 湖南省长沙市雨花区 |
1 | # 指定我们需要的列属性名 |
name | score | |
---|---|---|
1 | 小王 | 600.0 |
2 | 张菲 | 550.0 |
1 | # 取出第1和2行,0和3列 |
name | score | |
---|---|---|
1 | 小王 | 600.0 |
2 | 张菲 | 550.0 |
at和iat
at
at函数类似于loc,但是at函数取出的仅仅是一个值
1 | df22 = df.at[4,"sex"] |
1 | df.at[2,"name"] |
1 | df0 |
小明 | 小红 | 小孙 | |
---|---|---|---|
语文 | 101 | 102 | 140 |
数学 | 114 | 95 | 67 |
英语 | 87 | 128 | 117 |
1 | # 同时指定索引和列名 |
1 | # at、loc连用 |
1 | df |
name | sex | age | score | address | |
---|---|---|---|---|---|
0 | 小明 | 男 | 20 | NaN | 广东省深圳市南山区 |
1 | 小王 | 女 | 23 | 600.0 | NaN |
2 | 张菲 | 女 | 18 | 550.0 | 湖南省长沙市雨花区 |
3 | 关宇 | 男 | 21 | NaN | 北京市东城区 |
4 | 孙小小 | 女 | 25 | 610.0 | 广东省广州市白云区 |
5 | 王建国 | 男 | 21 | 580.0 | 湖北省武汉市江夏区 |
6 | 刘蓓 | 女 | 24 | 634.0 | 广东省深圳市龙华区 |
1 | # 列名为name的第4个元素 |
iat
和iloc一样,仅仅支持对数字索引操作
1 | df24 = df.iat[2,4] |
1 | df.loc[2].iat[4] |
1 | df.iloc[2].iat[4] |
any和all
- any:如果至少有一个为True,则为True
- all:需要所有结果为True,才会为True
当传入的axis=1,会按照行进行查询;axis=0表示按照列查询
在Series数据的比较
1 | # 两个False通过any结果为False |
1 | pd.Series([True, False]).any() # True |
1 | pd.Series([True, False]).all() # False |
1 | # any:是否跳过空值 |
1 | pd.Series([np.nan]).any(skipna=False) # True |
1 | # all:是否跳过空值 |
1 | pd.Series([np.nan]).all(skipna=False) #True |
在DataFrame的比较
1 | df0 |
小明 | 小红 | 小孙 | |
---|---|---|---|
语文 | 101 | 102 | 140 |
数学 | 114 | 95 | 67 |
英语 | 87 | 128 | 117 |
1 | # 1、取出待查询的数据 |
小明 | 小红 | |
---|---|---|
语文 | 101 | 102 |
数学 | 114 | 95 |
英语 | 87 | 128 |
1 | # 2、进行比较 |
小明 | 小红 | |
---|---|---|
语文 | True | True |
数学 | True | False |
英语 | False | True |
any
1 | # 3、使用any函数筛选 |
all
只有语文同时满足3个人都大于100
1 | # 4、使用all函数筛选:只有语文满足3个人同时大于100 |
总结
本文通过模拟的数据介绍了pandas的3对函数使用。其中loc和iloc函数是十分常用和实用的函数,自己经常会使用。至此,pandas的数据筛选部分已经全部介绍完成。当然介绍的方法只是pandas丰富取数技巧中的部分,还有很多的函数和方法需要读者自己平时去学习和积累,希望介绍的方法对大家有所帮助。