加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-17 17:35:46 所属栏目:Python 来源:网络整理
导读:假设我有一个类似于以下内容的pandas dataFrame(data_stores): store| item1 | item2 | item3------------------------------1 | 45 | 50 | 53 1 | 200 | 300 | 2502 | 20 | 17 | 21 2 | 300 | 350 | 400 假设我想在均值的列item1上以及在总和的列item2和it

假设我有一个类似于以下内容的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上以及在总和的列item2和item3上进行聚合.

通常可以通过以下方式完成此操作:

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

但是,无法通过以下方式(更有效地)完成此操作:

 data_stores_total= data_stores.groupby(['store'],['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','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'],'item3']}

d1 = {k: oldk for oldk,oldv in d.items() for k in oldv}
print (d1)
{'item1': 'mean',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','sum')
out['item1'] = func
print (out)
{'item2': '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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读