我认为这是一个简单的解决方案,我不确定我缺少什么。我有一个数据框:
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
我想删除False
中包含c3
的所有行。 c3
是dtype=bool
。我一直遇到问题,因为它是一个布尔值而不是字符串/ int / etc,我之前没有处理过。
感谢您的帮助!
答案 0 :(得分:20)
Pandas以非常简洁明了的方式处理布尔值:
df = df[df.c3]
当您使用df[...]
过滤数据帧时,通常会编写一些返回布尔值的函数(如df.x > 2
)。但在这种情况下,由于该列已经是一个布尔值,您可以将df.c3
置于其自身,这将获得True
的所有行。
如果您想要反过来(正如您隐含的问题的原始标题),您可以使用df[~df.c3]
,~
反转布尔值。
有关Pandas中布尔索引的更多信息,请参阅docs。
答案 1 :(得分:7)
问题的标题和问题本身恰恰相反,但是:
df = df[df['c3'] == True] # df will have only rows with True in c3
答案 2 :(得分:1)
df.drop(df[df['c3'] == False].index, inplace=True)
这会明确删除'c3'
为False
的行,而不只是保留评估为True
的行
答案 3 :(得分:1)
df
Output:
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
df[df.c3 == True]
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:20 False False True
2015-03-07 01:27:30 False False True
答案 4 :(得分:0)
考虑DataFrame.query
。这样就可以进行链式操作,从而避免通过变量名来引用数据框。
filtered_df = df.query('my_col')
这应该返回my_col
评估为true的行。要反转结果,请改用query('~my_col'
。
改为就地执行此操作:
df.query('my_col', inplace=True)