1 回答
TA贡献1856条经验 获得超17个赞
这是不可能的,只有你可以用函数的键和列名的列表定义字典,然后在循环中用值交换键:
data_stores = pd.DataFrame({'store': [1, 1, 2, 2],
'item1': [45, 200, 20, 300],
'item2': [50, 300, 17, 350],
'item3': [53, 250, 21, 400]})
print (data_stores)
store item1 item2 item3
0 1 45 50 53
1 1 200 300 250
2 2 20 17 21
3 2 300 350 400
d = {'mean':'item1', 'sum' : ['item2', 'item3']}
out = {}
for k, v in d.items():
if isinstance(v, list):
for x in v:
out[x] = k
else:
out[v] = k
print (out)
{'item1': 'mean', 'item2': 'sum', 'item3': 'sum'}
data_stores_total = data_stores.groupby('store', as_index=False).agg(out)
print (data_stores_total)
store item1 item2 item3
0 1 122.5 350 303
1 2 160.0 367 421
或者:
d = {'mean':['item1'], 'sum' : ['item2', 'item3']}
d1 = {k: oldk for oldk, oldv in d.items() for k in oldv}
print (d1)
{'item1': 'mean', 'item2': 'sum', 'item3': 'sum'}
data_stores_total = data_stores.groupby('store', as_index=False).agg(d1)
print (data_stores_total)
store item1 item2 item3
0 1 122.5 350 303
1 2 160.0 367 421
编辑:
如果想通过相同的聚合函数聚合所有列而没有几个列,您可以通过所有列创建字典,difference并按列表过滤,然后添加缺失的对键:列值:聚合函数:
out = dict.fromkeys(data_stores.columns.difference(['store','item1']), 'sum')
out['item1'] = 'mean'
print (out)
{'item2': 'sum', 'item3': 'sum', 'item1': 'mean'}
data_stores_total = data_stores.groupby('store', as_index=False).agg(out)
print (data_stores_total)
store item2 item3 item1
0 1 350 303 122.5
1 2 367 421 160.0
您还可以传递使用此列的自定义函数:
def func(x):
return x.sum() / x.mean()
out = dict.fromkeys(data_stores.columns.difference(['store','item1']), 'sum')
out['item1'] = func
print (out)
{'item2': 'sum', 'item3': 'sum', 'item1': <function func at 0x000000000F3950D0>}
data_stores_total = data_stores.groupby('store', as_index=False).agg(out)
print (data_stores_total)
store item2 item3 item1
0 1 350 303 2
1 2 367 421 2
添加回答
举报