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 中输出二进制结果