首页 > 解决方案 > 基于 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 中的节点属性中,因此键必须严格为“已分配”价值。

标签: pythonpandas

解决方案


也许满足于 a dictofdicts而不是任意数量的变量。键是唯一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()

推荐阅读