如何在pandas.DataFrame.query中删除NA

时间:2016-10-23 00:52:22

标签: python pandas

考虑df

df = pd.DataFrame(dict(A=[-1, 0, 1, np.nan, 2, np.nan, 3, 4]))

我可以像这样放弃NA

df.dropna()

enter image description here

但我如何在query方法

中进行此操作
df.query('A is not null')

不起作用......有什么用?

3 个答案:

答案 0 :(得分:2)

DataFrame.query方法基于pandas.eval解释器。那里没有定义null。同样地,Noneis都不是。但是,您可以使用这种hackish方法:

df.query('A < inf')

幸运的是,名称inf已定义,与之比较仅返回数字。

答案 1 :(得分:2)

想法#2:NaN的独特之处在于它们与自己并不相同:

In [22]: df.query("A == A")
Out[22]: 
     A
0 -1.0
1  0.0
2  1.0
4  2.0
6  3.0
7  4.0

(最初的想法#1是使用df.query("A.notnull()"),但这只有效,因为numexpr未安装在该环境中,这限制了query在该环境中的实用性第一名。)

答案 2 :(得分:1)

您可以使用外部合并和过滤器从DF中删除从查询中获取的元素:

import pandas as pd

df = pd.DataFrame(dict(A=[-1, 0, 1, np.nan, 2, np.nan, 3, 4]))
not_null_df = df[df.A.notnull()]

new_df = df.merge(not_null_df, how='outer', indicator=True)
new_df = new_df[new_df._merge == 'both']
del new_df['_merge']