Pandas基于time_gap分组并按count加权计算average_speed的方法
正确实现分组聚合的方法
你之前的代码失败的核心原因是agg方法的参数格式错误:你用了集合({("count", sum), ("average_speed", average_speed_mean)}),但pandas要求agg接收的是字典(键为列名,值为对应聚合函数)或者关键字参数形式的聚合规则。
以下是两种可行的正确实现方式:
方式一:关键字参数命名聚合结果列(推荐)
这种方式可以直接指定聚合后的列名,可读性更强:
import numpy as np def average_speed_mean(x): try: return np.average(x["average_speed"], weights=x["count"]) except ZeroDivisionError: return 0 # 按time_gap分组,计算count总和与加权平均速度 result_df = df_merged.groupby("time_gap").agg( total_count=("count", "sum"), weighted_avg_speed=("average_speed", average_speed_mean) )
方式二:字典形式指定聚合规则
如果希望保留原列名作为聚合后的列名,可以用字典传递参数:
import numpy as np def average_speed_mean(x): try: return np.average(x["average_speed"], weights=x["count"]) except ZeroDivisionError: return 0 result_df = df_merged.groupby("time_gap").agg({ "count": "sum", "average_speed": average_speed_mean })
额外说明
由于time_gap是category类型,默认分组会保留所有类别(包括没有对应数据的类别)。如果只想保留有数据的类别,可以在groupby中添加observed=True参数:
result_df = df_merged.groupby("time_gap", observed=True).agg( total_count=("count", "sum"), weighted_avg_speed=("average_speed", average_speed_mean) )
内容的提问来源于stack exchange,提问作者Para
相关产品推荐
相关产品推荐

