熊猫-根据价值过滤行

时间:2019-05-21 00:03:07

标签: pandas

我有一个如下所示的数据框:

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的行被遗漏了

3 个答案:

答案 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