删除熊猫数据框列中包含 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
的所有行。 c3
是 dtype=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
。我们可以有空值或其他不是True
或False
的对象。这说明了这一点。严格来说,如果我们假设 OP 说的是真的,那么你是绝对正确的。【参考方案4】:
问题的标题和问题本身正好相反,但是:
df = df[df['c3'] == True] # df will have only rows with True in c3
【讨论】:
这将计算另一个带有df['c3'] == True
的布尔系列,这是完全多余的 - 请参阅 ***.com/a/37213642/281545以上是关于删除熊猫数据框列中包含 False 的行的主要内容,如果未能解决你的问题,请参考以下文章