删除pandas数据框列中包含“False”的行

时间:2016-05-13 15:10:01

标签: python pandas dataframe boolean

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

         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的所有行。 c3dtype=bool。我一直遇到问题,因为它是一个布尔值而不是字符串/ int / etc,我之前没有处理过。

感谢您的帮助!

5 个答案:

答案 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)