Pandas - 删除 x 列中字符串 a 和 y 列中字符串 b 的行

Pandas - Deleting rows with string a in column x and string b in column y

我正在寻找一种方法来删除在不同列中同时包含某些不同字符串的行。

我有这样的数据集:

    A       B      C       D
0  in    summer    x      NaN
1  in    summer    y      0.0
2  out   summer    g      3.2
3  out   winter    h      4.4
4  in    winter    e      0.0
5  in    summer    y      2.6

我想删除 A 中包含 out、B 中包含 winter 的所有条目,并删除 D 中的所有 NaN 和 0.0 值

为了摆脱我使用的 NaN:

df.dropna(subset = ['D'])

这是为了清除 B

的冬天
df[~df.B.str.contains('winter')] 
df[~df.A.str.contains('out')] --> the above for winter will be undone

但是,当再次尝试使用上层命令删除 A 中的 out 时,第一个命令就像从未发生过一样,冬季条目都回来了,只是我整理了 A 中的 out。以及如何我是否也要去掉 D 中的 0.0 浮点值?

期望的输出:

    A       B      C       D
5  in    summer    y      2.6

抱歉,我在 Python 方面经验不足,但我需要为一个项目执行此操作。

通过 & 链接多个条件并通过 boolean indexing 过滤:

m1 = ~df.B.str.contains('winter')
m2 = ~df.A.str.contains('out')
m3 =  df.D.fillna(0).ne(0)

df = df[m1 & m2 & m3]

print (df)
    A       B  C    D
5  in  summer  y  2.6

您的代码 (df[~df.…)]) 的问题在于它创建了一个 临时 输出, 但原始DataFrame保持不变。

获得预期结果:

  • 运行 drop 通过比较可以 select 传递所有行的索引 具有任何固定值,
  • 然后,过滤掉D列中的NaN,运行 dropna,如在您的代码中, 但这应该是 chained 语句,
  • 将结果保存回 df.

示例:

df = df.drop(df.query("A == 'out' or B == 'winter' or D == 0").index).dropna(subset = ['D'])

然后当你打印 df 你会得到:

    A       B  C    D
5  in  summer  y  2.6

另一种选择

运行:

df = df.drop(df.query("A == 'out' or B == 'winter' or D == 0 or D != D").index)

此代码依赖于 NaN 等于另一个 NaN 的事实, 所以你可以不用显式调用 dropna.

还有一个选择

只需查询 想要的 行并将结果保存回df:

df = df.query("A != 'out' and B != 'winter' and D != 0 and D == D")

要查看要删除的任何“部分”行,您可以 运行 query 使用 相应的部分查询,例如:

df.query("A == 'out'")

将在 A 列中显示具有“不需要”值的行。

如果您想打印带有“不需要的”值的行,例如2列,扩展查询 因此:

df.query("A == 'out' or B == 'winter'")