You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark转Pandas:多列聚合函数改写问题求助

Pandas实现Spark多列聚合逻辑的解决方案

原Spark聚合逻辑

你的Spark代码实现了按group分组后的两个聚合计算:

.groupby('group')
        .agg(
            (F.max('used')/678).alias('used'),
            ((F.max('free')+F.max('used'))/678).alias('total')
        )

问题说明

你尝试用以下自定义函数实现Pandas版本,但接收两参数的total函数无法正常运行:

def used(x):
    return max(x)/678
def total(x,y):
    return (max(x)+max(y))/678

这是因为Pandas的agg方法中,针对单列的聚合函数仅能接收该列的Series作为参数,无法直接传递多列给一个函数。下面提供两种可行的实现方式:


方法一:直接用agg结合assign计算

无需自定义函数,先聚合得到所需中间值,再计算total:

import pandas as pd

# 假设你的Pandas DataFrame为df
result = df.groupby('group').agg(
    used=('used', lambda col: col.max() / 678),
    max_used=('used', 'max'),
    max_free=('free', 'max')
).assign(
    total=lambda row: (row['max_used'] + row['max_free']) / 678
).drop(['max_used', 'max_free'], axis=1)

方法二:用自定义函数结合apply

如果偏好自定义函数,可通过groupby.apply传入整个分组DataFrame,在函数内处理多列:

import pandas as pd

def group_agg(group_df):
    max_used = group_df['used'].max()
    max_free = group_df['free'].max()
    return pd.Series({
        'used': max_used / 678,
        'total': (max_used + max_free) / 678
    })

# 假设你的Pandas DataFrame为df
result = df.groupby('group').apply(group_agg)

内容的提问来源于stack exchange,提问作者user5764

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:15:10