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
相关产品推荐
相关产品推荐

