删除熊猫数据框列中包含 False 的行

Posted

技术标签:

【中文标题】删除熊猫数据框列中包含 False 的行【英文标题】:Remove rows that contain False in a column of pandas dataframe 【发布时间】:2016-09-09 20:39:03 【问题描述】:

我认为这是一个简单的解决方法,但我不确定我缺少什么。我有一个这样的数据框:

         index               c1       c2         c3
2015-03-07 01:27:05        False    False       True   
2015-03-07 01:27:10        False    False       True   
2015-03-07 01:27:15        False    False       False   
2015-03-07 01:27:20        False    False       True   
2015-03-07 01:27:25        False    False       False   
2015-03-07 01:27:30        False    False       True   

我想删除c3 中包含False 的所有行。 c3dtype=bool。我一直遇到问题,因为它是一个布尔值而不是字符串/整数/等,我以前没有处理过。

【问题讨论】:

你能提供一些代码吗? 你是如何处理文件的? 【参考方案1】:

Pandas 以非常简洁直接的方式处理 booleans:

df = df[df.c3]

这做同样的事情,但不创建副本(使其更快):

df = df.loc[df.c3, :]

当您使用df[...] 过滤数据帧时,您通常会编写一些返回布尔值的函数(如df.x > 2)。但在这种情况下,由于该列已经是一个布尔值,您只需将 df.c3 单独放入,这将获得所有 True 的行。

如果您想得到相反的结果(正如您问题的原始标题所暗示的那样),您可以使用 df[~df.c3]df.loc[~df.c3, :],其中 ~ 反转布尔值。

有关 Pandas 中布尔索引的更多信息,请参阅docs。感谢@Mr_and_Mrs_D 关于.loc 的建议。

【讨论】:

不确定,但这可能存在创建副本的问题 - 也许df = df.loc[df.c3, :] 对于大数据帧会更快?【参考方案2】:

考虑DataFrame.query。这允许链式操作,从而避免通过变量名称引用数据帧。

filtered_df = df.query('my_col')

这应该返回 my_col 计算结果为 true 的行。要反转结果,请改用query('~my_col')。

改为就地执行此操作:

df.query('my_col', inplace=True)

【讨论】:

【参考方案3】:

解决方案

df.drop(df[df['c3'] == False].index, inplace=True)

这会显式删除 'c3'False 的行,而不仅仅是保留评估为 True 的行

【讨论】:

既然c3 is a dtype=bool 不足以说df[~df['c3']]?这也有计算 ~df['c3'] 的缺点 - “评估为真”与布尔系列的“不为假”不同吗? @Mr_and_Mrs_D 有时我会提供猜测一个人可能需要什么的答案。我想象了一个场景,'c3' 不是dtype==bool,而是dtype=object。我们可以有空值或其他不是TrueFalse 的对象。这说明了这一点。严格来说,如果我们假设 OP 说的是真的,那么你是绝对正确的。【参考方案4】:

问题的标题和问题本身正好相反,但是:

df = df[df['c3'] == True]  # df will have only rows with True in c3

【讨论】:

这将计算另一个带有 df['c3'] == True 的布尔系列,这是完全多余的 - 请参阅 ***.com/a/37213642/281545

以上是关于删除熊猫数据框列中包含 False 的行的主要内容,如果未能解决你的问题,请参考以下文章

熊猫删除任何字符串的行

删除熊猫中多列中包含一段字符串的所有行

熊猫数据框列中的成员资格测试

如何获取熊猫数据框中的行,列中具有最大值并保留原始索引?

当计数为零时熊猫 groupby 以及如何在结果中包含零值

熊猫数据框中的内部连接/合并比左数据框提供更多的行