Pandas groupby 将特定函数聚合/应用到特定列(np.sum,sum)

Posted

技术标签:

【中文标题】Pandas groupby 将特定函数聚合/应用到特定列(np.sum,sum)【英文标题】:Pandas groupy aggregate/apply specific functions to specific columns (np.sum, sum) 【发布时间】:2021-04-25 03:37:36 【问题描述】:

我有以下数据框:

df = pd.DataFrame(['name': 'John', 'counter' : [1,1,3,5],'name': 'John', 'counter' : [2,0,1,5],'name': 'John', 'counter' : [4,1,2,2]])
df['counter'] = df['counter'].apply(lambda x : np.array(x))
df['counter2'] = df['counter']
df['pmcount'] = 1

df
   name       counter      counter2  pmcount
0  John  [1, 1, 3, 5]  [1, 1, 3, 5]        1
1  John  [2, 0, 1, 5]  [2, 0, 1, 5]        1
2  John  [4, 1, 2, 2]  [4, 1, 2, 2]        1

我需要按“名称”对数据进行分组,分别对每一列应用“np.sum”、“np.maximum.reduce”和“sum”函数。


另外,每个功能都可以正常工作:

result1 = df.groupby(['name'])['counter'].apply(np.sum).reset_index()
result1
   name        counter
0  John  [7, 2, 6, 12]

result2 = df.groupby(['name'])['counter2'].apply(lambda x: np.maximum.reduce(list(x))).reset_index()
result2
   name      counter2
0  John  [4, 1, 3, 5]

result3 = df.groupby(['name'])['pmcount'].sum().reset_index()
result3
   name  pmcount
0  John        3

但是当我尝试使用 pandas agreggate 函数为每一列指定每个函数时,我得到一个错误:

function_dict = 'counter': np.sum , "counter2": lambda x: np.maximum.reduce(list(x)) , 'pmcount': 'sum'
result = df.groupby('name').agg(function_dict)

ValueError: Must produce aggregated value

预期结果:

   name        counter      counter2  pmcount
0  John  [7, 2, 6, 12]  [4, 1, 3, 5]        3

我尝试在数组列中使用列表类型而不是 np.array,但不仅我得到了同样的错误, 但我也无法在 np.sum 函数中重现与以前相同的结果(即使将 np.array() 与 lambda 表达式一起使用)。

【问题讨论】:

【参考方案1】:

无需汇总,因为您已经完成了工作:

    分解“分组依据”操作 请勿重置索引(在中间步骤) 创建一个具有相同索引的新数据框
ndf = pd.DataFrame()
ndf['counter'] = gdf['counter'].apply(np.sum)
ndf['counter2'] = gdf['counter2'].apply(lambda x: np.maximum.reduce(list(x)))
ndf['pmcount'] = gdf['pmcount'].sum()
ndf.reset_index(inplace=True)

Out[1]: 
   name        counter      counter2  pmcount
0  John  [7, 2, 6, 12]  [4, 1, 3, 5]        3

【讨论】:

【参考方案2】:

尝试:

df = df.groupby(['name']).agg('counter': lambda x: list(x.sum()), 'counter2': lambda x: ((list(x))), 'pmcount': 'sum') .reset_index()
df['counter2'] = df['counter2'].apply(lambda x: np.maximum.reduce(np.array(x)))

df.groupby(['name']).agg('counter': lambda x: list(x.sum()), 'counter2': lambda x: list(np.maximum.reduce(list(x))), 'pmcount': 'sum').reset_index()

df:

    name    counter         counter2        pmcount
0   John    [7, 2, 6, 12]   [4, 1, 3, 5]    3

【讨论】:

【参考方案3】:

您必须将结果转换为列表,否则,结果将被解释为 Series o DataFrame

function_dict = 'counter': lambda x: list(np.sum(x)) , "counter2": lambda x: list(np.maximum.reduce(list(x))) , 'pmcount': 'sum'

【讨论】:

以上是关于Pandas groupby 将特定函数聚合/应用到特定列(np.sum,sum)的主要内容,如果未能解决你的问题,请参考以下文章

如何将 groupBy 和聚合函数应用于 PySpark DataFrame 中的特定窗口?

数据分析—Pandas 中的分组聚合Groupby 高阶操作

应用自定义 groupby 聚合函数在 pandas python 中输出二进制结果

pandas聚合和分组运算之groupby

pandas groupby 按总和聚合特定列,按最常见值聚合其他列

使用 pandas GroupBy 和时间序列重采样的平均聚合