如何在groupby
中keys
两个dictionary
并获得另一个键val
的值的总和。
Input:
data = {'key1':['a','a', 'b', 'b'], 'key2':['m','n', 'm', 'm'],
'val':[1, 2, 3, 4]}
在此示例中,我要groupby
和key1
,然后对key2
中的值求和。
val
Expected:
实际上,我不想将字典data = {'key1':['a','a', 'b', 'b'], 'key2':['m','n', 'm', 'm'],
'val':[1, 2, 3, 4], 'val_sum':[1, 2, 7, 7]}
转换为data
,然后再转换回pandas.DataFrame
来实现它,因为我的dictionary
实际上很大。
更新:
为了帮助理解生成的data
,我使用val_sum
发布了代码。
pandas.DataFrame
结果如下:
df = pd.DataFrame(data)
tmp = df.groupby(['key1', 'key2'])['val'].agg({'val_sum':'sum'})
df['val_sum'] = df.set_index(['key1', 'key2']).index.map(tmp.to_dict()['val_sum'])
答案 0 :(得分:1)
您可以使用defaultdict构建自己的求和解决方案,如下所述。
from collections import defaultdict
data = {'key1':['a','a', 'b', 'b'], 'key2':['m','n', 'm', 'm'],
'val':[1, 2, 3, 4]}
keys_to_group = ['key1','key2']
temp = defaultdict(int) #initializes sum to zero
for i, *key_group in zip(data['val'], *[data[key] for key in keys_to_group]):
print(i, key_group) #key_group now looks like ['a', 'm'] or ['b', 'm'] or so on
temp[tuple(key_group)] += i
val_sum = [temp[key_group] for key_group in zip(*[data[key] for key in keys_to_group])]
data['val_sum'] = val_sum
print(data)
{'key1': ['a', 'a', 'b', 'b'],
'key2': ['m', 'n', 'm', 'm'],
'val': [1, 2, 3, 4],
'val_sum': [1, 2, 7, 7]}
但是,看来您的数据似乎更适合表格结构,并且,如果您打算做的不仅仅是这项操作,那么无论如何都应该将其加载到数据框中。