在数据帧中总结布尔值

时间:2016-08-08 12:50:23

标签: python pandas dataframe

我有一个非索引的Pandas数据帧,其中每一行都包含带有一些NaN的数值和布尔值。我的数据框中的示例行可能如下所示(上面带有变量):

X_1  X_2  X_3 X_4   X_5  X_6 X_7  X_8  X_9   X_10  X_11  X_12
24.4 True 5.1 False 22.4 55  33.4 True 18.04 False NaN   NaN

我想在我的数据框中添加一个新变量,称之为X_13,这是每行中True值的数量。所以在上面的例子中,我想获得:

X_1  X_2  X_3 X_4   X_5  X_6 X_7  X_8  X_9   X_10  X_11  X_12 X_13
24.4 True 5.1 False 22.4 55  33.4 True 18.04 False NaN   NaN  2

我已经尝试df[X_13] = df[X_2] + df[X_4] + df[X_8] + df[X_10]并且除了行在预期布尔值的位置包含NaN之外,它给了我想要的内容。对于这些行,X_13的值为NaN

抱歉 - 这感觉应该是荒谬的简单。有什么建议?

1 个答案:

答案 0 :(得分:6)

选择布尔列然后求和:

df.select_dtypes(include=['bool']).sum(axis=1)

如果您有NaN,请先填写False:

df.fillna(False).select_dtypes(include=['bool']).sum(axis=1)

考虑这个DataFrame:

df
Out: 
       a      b  c     d
0   True  False  1  True
1  False   True  2   NaN

df == True也为(0,c)返回True:

df == True
Out: 
       a      b      c      d
0   True  False   True   True
1  False   True  False  False

因此,如果你得到总和,你将获得3而不是2.另一个重点是布尔数组cannot contain NaNs。因此,如果您检查dtypes,您将看到:

df.dtypes
Out: 
a      bool
b      bool
c     int64
d    object
dtype: object

通过填充False s,您可以拥有一个布尔数组:

df.fillna(False).dtypes
Out: 
a     bool
b     bool
c    int64
d     bool
dtype: object

现在你可以通过选择布尔列来安全地求和。

df.fillna(False).select_dtypes(include=['bool']).sum(axis=1)
Out: 
0    2
1    1
dtype: int64