基于Groupby获取列的值计数

问题描述 投票:1回答:3

我有两列数据框,其中一列将用于分组我们的数据,另一列我想获得每组的值计数。

其中一列“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中的节点属性,因此键必须严格为'已分配'值。

python pandas
3个回答
1
投票

也许解决dictdicts而不是任意数量的变量。键是唯一的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()

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']

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

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

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

输出如下:

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

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

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}
© www.soinside.com 2019 - 2024. All rights reserved.