Pandas高级:query方法教你优雅的查询

好久好久没写博客了。最近看到个很实用的pandas方法,记录下。

query()

DataFrame.query(exprinplace=False**kwargs),用于通过boolean表达式来查询dataframe中的列。

主要参数为expr,它是字符串表达式,有如下说明:

可以引用变量,方法是在变量前添加一个@字符,例如@a + b。

可以在反引号内将包含空格或运算符的列名引用起来。 这样,您还可以转义以数字开头或Python关键字的名称。 基本上是无效的Python标识符。 

例如,如果有一列称为a a,而您想将其与b相加,则查询应为`a a` + b。

Examples

df = pd.DataFrame({'A': range(1, 6),
                   'B': range(10, 0, -2),
                   'C C': range(10, 5, -1)})
df

	A	B	C C
0	1	10	10
1	2	8	9
2	3	6	8
3	4	4	7
4	5	2	6

如果我要查询A列值大于B列值的结果,正常情况我们会做如下操作:

df[df.A > df.B]  或  df[df['A'] > df['B']]

	A	B	C C
4	5	2	6

然而这不够优雅,使用query可以简化代码:

df.query('A > B ')

A	B	C C
4	5	2	6

用同样的方法,查询B列和C C列相等的数据:

df.query('B == `C C`')

A	B	C C
0	1	10	10

注意对于C C列的列名中间有空格或运算符等其他特殊符号的情况,上文提到,要用反引号(就是键盘上第二排第一个按键,有‘~’这个符号的按键)。

上述表达式等同于:

df[df.B == df['C C']]

你以为这就完了?如果这样我也没必要写这篇博客了。

上面都是单一条件查询,若涉及多个条件查询,情况如何呢?

如我要查询A列小于B列,且A列小于C C列的数据,一般情况我们会做如下写法:

df[(df['A'] < df['B']) & (df['A'] < df['C C'])]


A	B	C C
0	1	10	10
1	2	8	9
2	3	6	8

用query方法简洁如下:

df.query('A < B & A < `C C`')

A	B	C C
0	1	10	10
1	2	8	9
2	3	6	8

再比如,我要查询A列小于B列,加上A列值为4的数据,query方法如下:

df.query('A < B | A == 4')

A	B	C C
0	1	10	10
1	2	8	9
2	3	6	8
3	4	4	7

是不是高级而又优雅,符合python的精髓。

以后数据筛选或查询就用query吧!

你可能感兴趣的:(Pandas高级,机器学习,数据分析,pandas,query,数据查询,python)