gpt4 book ai didi

python - 在 agg 函数中聚合具有一个属性的多列

转载 作者:太空宇宙 更新时间:2023-11-04 02:08:00 29 4
gpt4 key购买 nike

假设我有一个 pandas dataFrame (data_stores) 类似于以下内容:

store| item1 | item2 | item3
------------------------------
1 | 45 | 50 | 53
1 | 200 | 300 | 250
2 | 20 | 17 | 21
2 | 300 | 350 | 400

假设我想在 item1 列和 mean 列以及 item2item3 列上进行聚合与总和

这通常可以通过以下方式完成:

data_stores_total= data_stores.groupby(['store'], as_index=False).agg({'item1': 'mean', 'item2': 'sum', 'item3': 'sum' })

但是,这不能通过以下方式(更有效地)完成:

 data_stores_total= data_stores.groupby(['store'], as_index=False).agg({'item1': 'mean', ['item2', 'item3']: 'sum' })

以下两种对字典键更有意义的方式:

 data_stores_total= data_stores.groupby(['store'], as_index=False).agg({'mean': 'item1':, 'sum': ['item2', 'item3']})

有什么方法可以在数据框的某些列上使用相同的函数进行聚合,而无需在 agg 函数中为每个列编写新的字典属性?

最佳答案

这是不可能的,只有你可以用键定义函数的字典和列名的列表,然后在循环中交换键和值:

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 按列表过滤掉然后添加缺失对 key: value for column: aggregate function:

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

关于python - 在 agg 函数中聚合具有一个属性的多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54217753/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com