python - 基于 Groupby 获取列的值计数
问题描述
我有两列数据框,其中一列将用于对我们的数据进行分组,另一列我想获取每个组的值计数。
其中一列“已分配”包含重复的各种字符串,该列将用于对数据进行分组。
另一列“Acquired”由 0 或 1 组成,我想计算每组有多少个 0 和 1。
我想将每个组的计数存储在两个字典中,一个用于 0,另一个用于 1。
我的数据框如下所示:
df
Assigned Acquired
foo 1
bar 1
baz 0
foo 1
foo 0
... baz 0 ...
bar 1
foo 1
bar 0
baz 0
baz 0
这是我尝试过的:
df_acq = df.groupby('Assigned')
df_acq.value_counts('Acquired')
上述代码的输出是:
Assigned Acquired
foo 0 1
1 3
bar 0 1
1 2
baz 0 4
1 0
现在,我希望能够获取这个系列对象并将其转换为两个字典。理想情况下,这看起来像:
Acquired_0 = {
'foo': 1,
'bar': 1,
'baz': 4
}
Acquired_1 = {
'foo': 3,
'bar': 2,
'baz': 0,
}
我想也许使用 .to_dict() 会起作用,但这会为每个“分配”值创建两个键。示例: ('foo', 0): 1 and ('foo', 1): 3 这会导致问题,因为我最终会将这些字典添加到 networkx 中的节点属性中,因此键必须严格为“已分配”价值。
解决方案
也许满足于 a dict
ofdicts
而不是任意数量的变量。键是唯一Aqcuired
值:
import pandas as pd
d = pd.crosstab(df.Acquired, df.Assigned).to_dict(orient='index')
#{0: {'bar': 1, 'baz': 4, 'foo': 1}, 1: {'bar': 2, 'baz': 0, 'foo': 3}}
# If you know there are only 2:
Acquired_0, Acquired_1 = pd.crosstab(df.Acquired, df.Assigned).to_dict(orient='index').values()
推荐阅读
- javascript - 将文本添加到 DOM 元素而不导致重排以获得“渲染文本”
- c - 有没有办法不将 seccomp 过滤器继承给子进程?
- html - Bootstrap响应式文本对齐不起作用
- flutter - FlutterError:列表
不是 Map 类型的子类型 - cpu-architecture - gem5中load指令的执行过程
- python - 使用 pvlib 将时间数据转换为小时角
- oracle - 在 Oracle BI Publisher 中将数字转换为单词
- http - 理解 RFC2616 和代理服务器
- python - pip install PATH set 但 cmd 无法识别
- r - 计算数据框多列之间的百分比变化