我有一个如下所示的数据框:
col1,col2,value1,value2
type_1,type_2,,NaN
type_3,type_4,NaN,
type_5,type_6,apples,oranges
type_7,type_8,apples,apples
我正在尝试过滤掉其中value1与value2不同的上述数据框
预期输出:
col1,col2,value1,value2
type_1,type_2,,NaN
type_3,type_4,NaN,
type_5,type_6,apples,oranges
我已经完成以下工作:
df = df.query("value1 != value2")
我遇到一个问题,即空和NaN的行被遗漏了
答案 0 :(得分:2)
编辑:由于@WenYoBen提到了它,尽管您的示例没有显示这种情况。如果您的数据在gradle :dist-module:distTar
或NaN
上有value1
,并且您不想删除它。下面只会在value2
的行上都显示。我将您的样本中的1 NaN
更改为NaN
,以显示这种情况
pear
df.query("value1 != value2").dropna(subset=['value1', 'value2'], how='all')
Out[3056]:
col1 col2 value1 value2
0 type_1 type_2 NaN pear
2 type_5 type_6 apples oranges
与其自身比较总是返回np.nan
。换句话说,False
返回np.nan != np.nan
,因此它将包含在您的输出中。如果需要将其过滤掉,只需将True
添加到输出中即可。
dropna
答案 1 :(得分:2)
您可以通过多种方式执行此操作:
boolean indexing
我将在这里使用.ne
代表not equal
df[df['value1'].ne(df['value2'])]
col1 col2 value1 value2
0 type_1 type_2 NaN NaN
1 type_3 type_4 NaN NaN
2 type_5 type_6 apples oranges
.query
df.query('value1 != value2')
col1 col2 value1 value2
0 type_1 type_2 NaN NaN
1 type_3 type_4 NaN NaN
2 type_5 type_6 apples oranges
答案 2 :(得分:0)
如果使用np.nan
进行检查,则会发现NaN
始终不等于NaN
np.nan==np.nan
Out[164]: False
所以您可能需要使用
df[df.fillna('NaN').eval('value1!=value2')]
Out[170]:
col1 col2 value1 value2
0 type_1 type_2 NaN
1 type_3 type_4 NaN
2 type_5 type_6 apples oranges