为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ABOUTYOU 2021-10-12 15:54:28
假设我有一个data_stores类似于以下内容的Pandas dataFrame ( ):store| item1 | item2 | item3------------------------------1    | 45    | 50    | 53  1    | 200   | 300   | 2502    | 20    | 17    | 21  2    | 300   | 350   | 400比方说,我想在列聚集item1与mean和列item2,并item3用sum。这通常可以通过以下方式完成: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函数中为每个列编写新的字典属性?
查看完整描述

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


查看完整回答
反对 回复 2021-10-12
  • 1 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信