pandas高级操作
- 一、复杂查询
- 1.1 逻辑筛选数据
- 1.2 函数筛选
- 1.3 isin()函数
- 1.4 查询df.query()
- 1.5 df.filter()对行名和列名进行筛选
一、复杂查询
1.1 逻辑筛选数据
以下是切片([])的一些逻辑筛选示例:
df[df['Q1'] == 8] # Q1等于8
df[~(df['Q1'] == 8)] # 不等于8
df[df.Q1 > df.Q2]
以下是.loc[]的一些实例:
# 表达式与切片一致
df.loc[df['Q1'] > 90, 'Q1':] # Q1大于90,显示Q1及其后所有列
df.loc[(df.Q1 > 80) & (df.Q2 < 15)]
df.loc[(df.Q1 > 90) | (df.Q2 < 90)]
需要注意的是,在进行或(|)、与(&)、非(~)运算时,各个独立逻辑表达式需要用括号括起来。
1.2 函数筛选
可以在表达式处使用lambda函数,默认变量是其操作的对象。如果操作的对象是一个DataFrame,那么变量就是这个DataFrame;如果是一个Series,那么就是这个Series。以下的例子中,s就是指df.Q1这个Series。
# 查询最大索引的值
df.Q1[lambda s: max(s.index)] # 值为21
# 计算最大值
max(df.Q1.index) # 99
df.Q1[df.index==99]
下面是一些示例:
df[lambda df: df['Q1'] == 8] # Q1为8的
df.loc[lambda df: df.Q1 == 8, 'Q1':'Q2'] # Q1为8,显示Q1、Q2
df.loc[:, lambda df: df.columns.str.len()==4]
1.3 isin()函数
该函数用于判断数据是否包含指定内容。可以传入一个列表,原数据只需要满足其中一个存在即可;也可以传入一个字典,键为列名,值为需要匹配的值,以实现按列个性化匹配存在的值。
df[df.team.isin(['A', 'B'])] # 包含A、B两组的
df[df.isin({'team':['C', 'D'], 'Q1':[36, 93]})]
1.4 查询df.query()
df.query(expr)使用布尔表达式查询DataFrame的列,表达式是一个字符串,类似于SQL中的where从句,相当灵活。
df.query('Q1 > Q2 > 90')
df.query('Q1 + Q2 > 180')
df.query('(Q1<50) & (Q2>40) and (Q3>80)') # &和and效果一样
df.query('team !="C"')
df.query('team not in("E", "A", "B")')
还支持@符号引入变量
a = df.Q1.mean()
df.query('Q1 > @a+40') # 大于平均分40分
df.query('Q1 > `Q2`+@a')
df.eval()与df.query()类似,也可以用于表达式筛选:
df[df.eval("Q1 > Q2 > 90")]
1.5 df.filter()对行名和列名进行筛选
df.filter()支持对行名和列名进行筛选,支持模糊匹配,正则表达式。
df.filter(items=['Q1', 'Q2']) # 选择两列
df.filter(regex='Q', axis=1) # 列名包含Q的列
df.filter(regex='m$', axis=1) # 以m结尾的列
df.filter(regex='r$', axis=0) # 行索引以r结尾的行
df.filter(regex='^R', axis=0).filter(like='Q', axis=1) # 行索引以R开头,列索引名中有Q的