我有一个非索引的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
。
抱歉 - 这感觉应该是荒谬的简单。有什么建议?
答案 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