创建一个DataFrame
import pandas as pd
data = {'name':['张三', '李四', '王五', '赵六'],'age':[20, 21, 22, 23], 'gender': [0, 1, 1, 1], 'stature': [165, 189, 178, 160], 'year': [2000, 2002, 2003, 1993]}
df = pd.DataFrame(data)
print (df)
运行结果如下:
name age gender stature year
0 张三 20 0 165 2000
1 李四 21 1 189 2002
2 王五 22 1 178 2003
3 赵六 23 1 160 1993
常用的筛选方法:
-
[]
:直接在DataFrame的
[]
中写筛选条件或者组合条件,组合条件之间可以使用逻辑符号
& |
等 -
loc/iloc
:
loc
按照标签值(列名和行索引取值)访问,
iloc
按照数字索引访问,均支持单值访问或切片查询,除此之外,
loc
还可以
指定返回的列变量
-
isin
:当查询条件不是一个取值范围,而是一些具体的值,就需要使用
isin
了,也可以做
取反
操作,在筛选条件前加
~
。 -
str.contains
:实现字符串的模糊筛选,类似sql语句中的
like
-
where
:接受的条件需要是布尔型,如果不满足条件,会被赋值为
默认的NaN
或者
指定其他值
-
query
:所有的筛选条件要在
' '
之内 -
filter
:不筛选具体数据,而是筛选特定的行或列 -
any
:如果至少有一个值为
True
,结果便是
True
。一般需要和其他操作配合使用,比如查看每列的空值情况 -
all
:需要所有的值都为
True
,结果才为
True
一、 筛选指定的列
筛选
name
列
:
# 1. 直接筛选,返回的是Series类型
df['name']
# 2. 使用loc筛选,返回的是DataFrame类型
df.loc[:, ['name']]
# 3. 使用filter,返回的是DataFrame类型
df.filter(items=['name'])
查询结果如下:
筛选
name
和
stature
列
:
# 1. 直接筛选
df[['name', 'stature']]
# 2. 使用loc筛选
df.loc[:, ['name', 'stature']]
# 3. 使用filter
df.filter(items=['name', 'stature'])
查询结果如下:
二、 按照条件筛选
2.1 单条件筛选
筛选姓名为
王五
的所有行
# 1. 直接筛选
df[df['name']=='王五']
# 2. 使用loc筛选
df.loc[df['name']=='王五']
# 3. 使用query查询,注意条件里有''时,两边要用""包住。
df.query("name=='王五'")
查询结果如下:
2.2 多条件组合筛选
筛选
gender
为1,并且姓名为
王五
的所有行
# 1. 直接筛选
df[(df['name']=='王五') & (df['gender']==1)]
# 2. 使用loc筛选
df.loc[(df['name']=='王五') & (df['gender']==1)]
# 3. 使用query查询,注意条件里有''时,两边要用""包住。
df.query("name=='王五' & gender==1")
查询结果如下:
筛选
gender
为1,并且姓名为
王五
或
赵六
的所有行
# 1. 直接筛选
df[(df['name']=='王五') | (df['name']=='赵六') & (df['gender']==1)]
# 2. 使用loc筛选
df.loc[(df['name']=='王五') | (df['name']=='赵六') & (df['gender']==1)]
# 3. 使用query查询,注意条件里有''时,两边要用""包住。
df.query("name=='王五' | name=='赵六' & gender==1")
# 4. 使用isin()筛选
df[df['name'].isin(['王五', '赵六']) & (df['gender']==1)]
筛选
name
中包含
王
的所有行
# 使用str.contains来筛选
df[df['name'].str.contains('王')]
查询结果如下:
筛选
name
中包含
王
或
赵
的所有行
# 使用str.contains来筛选
df[df['name'].str.contains('王|赵')]
查询结果如下:
查看每列的空值情况:
# 1. 查看每列是否有空值
df.isnull().any(axis=0)
'''
name False
age False
gender False
stature False
year False
dtype: bool
'''
# 2. 查看含有空值的行数
df.isnull().any(axis=1).sum()
# 0
如上按照条件筛选基本可以满足日常开发需要,pandas中条件筛选比较灵活,还有很多情况没有演示,大家可以自行组合各种筛选条件进行尝试。