我有两列数据框,其中一列将用于分组我们的数据,另一列我想获得每组的值计数。
其中一列“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中的节点属性,因此键必须严格为'已分配'值。
也许解决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()
最好分成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']
这是我创建一个虚拟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)
现在计算1
s我们可以这样做:
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
s,我们可以这样做:
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}