如果在 python 中满足两个列值的组合,则删除行

Delete rows if combination of two column values is satisfied in python

我有以下数据:我需要删除具有 (ColX='F' 和 ColY='Y') 组合的所有行。 我正在按照以下答案的建议尝试以下不同的代码。

  1. df = df[(df.ColX != 'F')&(df.ColY !='Y')] 但是此代码将删除所有带有(ColX=P 和 ColY=Y)以及(ColX=F 和 ColY=Y)的行。我的数据中需要包含(ColX=P 和 ColY=Y)的行。

  2. 掩码 = (df.ColX == 'F') & (df.ColY == 'Y') df[~掩码] 此代码不会删除我要删除的任何行。

    3.mask = (df.ColX == 'F') | (df.ColY == 'Y') df[~掩码] 此代码将删除带有 (ColX=P and ColY=Y) 以及 (ColX=F and ColY=Y) 的所有行。我的数据中需要包含(ColX=P 和 ColY=Y)的行。

非常感谢任何意见。谢谢!

 line_date      ColX       ColY    ColZ   rating        rw    

 2007-03-31       P         Y        56     1.000000  56.000000
 2007-03-10       P         Y        67     1.000000  67.000000
 2007-02-10       F         Y        66     1.000000  66.000000
 2007-01-13       2                  83     0.880678  73.096278
 2006-12-23       2         Y        88     0.793033  69.786942
 2006-11-09       F                  52     0.636655  33.106077
 2006-10-22       P                  66     0.581946  38.408408
 2006-09-29       F         Y        70     0.518825  36.317752

试试这个:

mask = (df.ColX == 'F') & (df.ColY == 'Y')
df[~mask]

输出:

    line_date ColX ColY  ColZ    rating         rw
0  2007-03-31    P    Y    56  1.000000  56.000000
1  2007-03-10    P    Y    67  1.000000  67.000000
3  2007-01-13    2  NaN    83  0.880678  73.096278
4  2006-12-23    2    Y    88  0.793033  69.786942
5  2006-11-09    F  NaN    52  0.636655  33.106077
6  2006-10-22    P  NaN    66  0.581946  38.408408

或者,因为我有点搞不懂你的输出应该是什么。

mask = (df.ColX == 'F') | (df.ColY == 'Y')
df[~mask]

输出:

    line_date ColX ColY  ColZ    rating         rw
3  2007-01-13    2  NaN    83  0.880678  73.096278
6  2006-10-22    P  NaN    66  0.581946  38.408408

您可以使用 DataFrame.query() method:

In [20]: df.query("ColX != 'F' or ColY != 'Y'")
Out[20]:
    line_date ColX ColY  ColZ    rating         rw
0  2007-03-31    P    Y    56  1.000000  56.000000
1  2007-03-10    P    Y    67  1.000000  67.000000
3  2007-01-13    2  NaN    83  0.880678  73.096278
4  2006-12-23    2    Y    88  0.793033  69.786942
5  2006-11-09    F  NaN    52  0.636655  33.106077
6  2006-10-22    P  NaN    66  0.581946  38.408408

下面的代码给了我预期的数据集:

filter_df=df[ ~(df['ColY'].str.contains("Y") & df['ColX'].str.contains("F")) ]