如果在 python 中满足两个列值的组合,则删除行
Delete rows if combination of two column values is satisfied in python
我有以下数据:我需要删除具有 (ColX='F' 和 ColY='Y') 组合的所有行。
我正在按照以下答案的建议尝试以下不同的代码。
df = df[(df.ColX != 'F')&(df.ColY !='Y')]
但是此代码将删除所有带有(ColX=P 和 ColY=Y)以及(ColX=F 和 ColY=Y)的行。我的数据中需要包含(ColX=P 和 ColY=Y)的行。
掩码 = (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")) ]
我有以下数据:我需要删除具有 (ColX='F' 和 ColY='Y') 组合的所有行。 我正在按照以下答案的建议尝试以下不同的代码。
df = df[(df.ColX != 'F')&(df.ColY !='Y')] 但是此代码将删除所有带有(ColX=P 和 ColY=Y)以及(ColX=F 和 ColY=Y)的行。我的数据中需要包含(ColX=P 和 ColY=Y)的行。
掩码 = (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")) ]