繁体   English   中英

删除一列中的值等于另一列中的值的行

[英]Remove rows where value in one column equals value in another

我正在努力弄清楚如何从pandas数据框中删除行,其中两个指定的列在一行中具有相同的值。

例如,在下面的示例中,我想删除第2列和第4列中具有重复值的行。

例如:

Column1 Column2 Column3 Column4
  Pat     123     John    456
  Pat     123     John    345 
  Jimmy   678     Mary    678 
  Larry   678     James   983

会变成:

Column1 Column2 Column3 Column4
  Pat     123     John    456 
  Pat     123     John    345
  Larry   678     James   983

任何帮助表示赞赏,谢谢!

Series.ne!=

df[df['Column2'] != df['Column4']]

  Column1  Column2 Column3  Column4
0     Pat      123    John      456
1     Pat      123    John      345
3   Larry      678   James      983

或者,使用operator.ne

df[operator.ne(df['Column2'], df['Column4'])]

  Column1  Column2 Column3  Column4
0     Pat      123    John      456
1     Pat      123    John      345
3   Larry      678   James      983

比较两者; 得到一个面具,然后过滤。

使用loc ,我们还可以提供回调(由@WB建议!)。

df.loc[lambda x : x['Column2'] != x['Column4']]

  Column1  Column2 Column3  Column4
0     Pat      123    John      456
1     Pat      123    John      345
3   Larry      678   James      983

query

df.query('Column2 != Column4')

  Column1  Column2 Column3  Column4
0     Pat      123    John      456
1     Pat      123    John      345
3   Larry      678   James      983

np.vectorize

import operator
f = pd.np.vectorize(lambda x, y: x != y)
df[f(df['Column2'], df['Column4'])]

  Column1  Column2 Column3  Column4
0     Pat      123    John      456
1     Pat      123    John      345
3   Larry      678   James      983

...纯娱乐。


列表理解

df[[x != y for x, y in zip(df['Column2'], df['Column4'])]]

  Column1  Column2 Column3  Column4
0     Pat      123    John      456
1     Pat      123    John      345
3   Larry      678   James      983

比你想象的更快!

另一种方式:

屏蔽匹配值的解决方案..

>>> mask = (df.Column2 == df.Column4)
>>> df[~mask]
  Column1  Column2 Column3  Column4
0     Pat      123    John      456
1     Pat      123    John      345
3   Larry      678   James      983

或者只是使用Boolean indexing ......

>>> df[ df.Column2 != df.Column4 ]
  Column1  Column2 Column3  Column4
0     Pat      123    John      456
1     Pat      123    John      345
3   Larry      678   James      983

另一个使用DataFrame.drop方法:

>>> df.drop(df[(df.Column2) == (df.Column4)].index)
  Column1  Column2 Column3  Column4
0     Pat      123    John      456
1     Pat      123    John      345
3   Larry      678   James      983

除上述之外,如果要直接对dataFrame进行更改,请使用inplace inplace=True

df.drop(df[(df.Column2) == (df.Column4)].index, inplace=True)

使用pandas.DataFrame.ne包装的另一个不错的解决方案灵活的比较方法ne。

>>> df[df.Column2.ne(df.Column4)]
  Column1  Column2 Column3  Column4
0     Pat      123    John      456
1     Pat      123    John      345
3   Larry      678   James      983

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM