python - 如何使用 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
解决方案
在所有情况下,您都可以使用以下方法求和并将输出保持为浮点数:
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
推荐阅读
- wysiwyg - 是否可以使用 monaco 创建 WYSIWYG 编辑器?
- python - 使用 beautifulsoup 从 iframe 标签中抓取 #document
- python - 通过 simple-salesforce 在 Python 中查询 id 列表
- google-apps-script - 如何将上下文菜单项添加到 Gmail 插件中的省略号菜单?
- powershell - 无法在 powershell 中安装模块 Power BI
- r - 长向量 stringdist 包 R
- android - 如何在Android的xml中将不同的字符串与另一个字符串拼接?
- html - 合并R中的html文件,文件名作为标题
- java - Jsoup.Element.text() 未正确编码 utf-8
- php - 致命错误:找不到 CakePHP 核心