我有一个数据框的两列,其中一列将用于对我们的数据进行分组,另一列我希望获得每一组的值计数。
其中一个列“ 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的节点属性中,因此键必须严格为“已分配”值。
答案 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)
现在可以计算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}