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

时间:2019-01-02 16:25:45

标签: python pandas

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

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

例如:

length 5 + any character

将变成:

5 0

感谢您的帮助,谢谢!

2 个答案:

答案 0 :(得分:7)

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,我们还可以提供回调(由@ W-B建议!)。

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

比您想象的要快!

答案 1 :(得分:2)

另一种解决方法:

屏蔽匹配值的解决方案。

Version: ImageMagick 7.0.8-22 Q16 x86_64 2018-12-31 https://imagemagick.org
Copyright: © 1999-2019 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI OpenMP
Delegates (built-in)

GPL Ghostscript 9.26 (2018-11-20)

Ubuntu 16.04

或者只是使用>>> 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

除了上述一项之外,如果您想直接对dataFrame进行更改,请使用>>> 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

inplace=True

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

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