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

前端之家收集整理的这篇文章主要介绍了python-在agg函数具有一个属性的多列上聚合 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

假设我想在均值的列item1上以及在总和的列item2和item3上进行聚合.

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

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

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

@H_502_5@ data_stores_total= data_stores.groupby(['store'],['item2','item3']: 'sum' })

以下两种方式都不适合字典键:

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

有什么方法可以在数据帧的某些列上使用相同的功能进行聚合,而无需在agg函数中为它们的每一个写入新的字典属性

最佳答案
这是不可能的,只有您可以定义带有功能键的字典和列名称列表,然后在循环中将键与值交换:

@H_502_5@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

要么:

@H_502_5@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,然后添加缺少的对键:列的值:聚合函数

@H_502_5@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

您还可以传递使用此列的自定义函数

@H_502_5@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

猜你在找的Python相关文章