获取基于Groupby的列的价值计数

时间:2019-02-15 21:39:47

标签: python pandas

我有一个数据框的两列,其中一列将用于对我们的数据进行分组,另一列我希望获得每一组的值计数。

其中一个列“ Assigned”包含重复的各种字符串,该列将用于对数据进行分组。

另一列“ 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(),但这会为每个“ Assigned”值创建两个键。示例:('foo',0):1和('foo',1):3 这会引起问题,因为我最终将这些字典添加到networkx的节点属性中,因此键必须严格为“已分配”值。

3 个答案:

答案 0 :(得分:1)

也许满足dict中的dicts,而不是任意数量的变量。键是唯一的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()

答案 1 :(得分:0)

最好拆分为2个单独的数据帧:

 df_0 = df[df.Acquired==0]
 df_1 = df[df.Acquired==1]

并将它们分组:

Acquired_0 = df_0.groupby('Assigned').count().to_dict()['Acquired']
Acquired_1 = df_1.groupby('Assigned').count().to_dict()['Acquired']

答案 2 :(得分:0)

这是我创建虚拟DataFrame的方法:

data = [['foo',1],['bar',1],['baz',0],['foo',1], ['foo',0], ['baz',1],['foo',0]]
df = pd.DataFrame(data, columns=['Assigned', 'Acquired'])

df.head(10)

DataFrame看起来像这样: enter image description here

现在可以计算1了,我们可以这样做:

df_acq = df.groupby('Assigned').sum()
acq_dict_1 = df_acq.to_dict()['Acquired']
print(acq_dict_1)

输出如下:

{'bar': 1, 'baz': 1, 'foo': 2}

对于0,我们可以这样做:

df_acq = df.groupby('Assigned').count() - df.groupby('Assigned').sum()
acq_dict_0 = df_acq.to_dict()['Acquired']
print(acq_dict_0)

输出看起来像这样:

{'bar': 0, 'baz': 1, 'foo': 2}