首页 > 解决方案 > 如何使用 pandas agg 对布尔值求和并始终获得数字作为结果?

问题描述

我有一个带有布尔类型列的数据框。我想使用 pandas 的 groupby 和 agg 函数获取每个 id 的 True 值的数量。我已经这样做了很多次,但结果列的类型似乎取决于数据框。这是一个例子:

import pandas as pd    
d = {'id': [1, 1, 2, 3], 'bool': [True, False, False, True]}
df = pd.DataFrame(data=d)

print(df.groupby(['id']).agg({'bool': 'sum'}))

我从这段代码得到的输出是:

   id   bool
0   1   True
1   2  False
2   3   True

这不是我想要的。现在,如果 agg 尝试对两个 True 值求和:

import pandas as pd    
d = {'id': [1, 1, 2, 3], 'bool': [True, True, False, True]}
df = pd.DataFrame(data=d)

print(df.groupby(['id']).agg({'bool': 'sum'}))

然后我得到:

   id                 bool
0   1                 2.00
1   2                 0.00
2   3                 1.00

这就是我想要的。

我见过一些行是 bool 类型的情况,而其他行是 float 类型的。似乎与分组的行数有关:如果只有一行,则显示bool值;如果超过一个,则结果类型为浮点数。我希望生成的聚合列始终为浮点类型。

熊猫版本是 1.0.1

标签: pythonpandaspandas-groupby

解决方案


在所有情况下,您都可以使用以下方法求和并将输出保持为浮点数:

import pandas as pd    
d = {'id': [1, 1, 2, 3], 'bool': [True, False, False, True]}
df = pd.DataFrame(data=d)
print(df.groupby(['id'])['bool'].sum().astype(float))

产生输出

id
1    1.0
2    0.0
3    1.0
Name: bool, dtype: float64

推荐阅读