如何在Pandas groupby中添加多列并合并多DataFrame为单表
解决方案
一、合并已有的三个独立DataFrame
假设你已经生成了三个分别包含单一统计列的DataFrame:
df_max:包含member_casual和max_ride_length列df_avg:包含member_casual和avg_ride_length列df_day:包含member_casual和most_active_day_of_week列
方法1:使用merge逐步合并
直接通过member_casual列作为关联键,多次调用merge完成合并,最后设置索引:
# 合并三个DataFrame merged_df = df_max.merge(df_avg, on='member_casual').merge(df_day, on='member_casual') # 将member_casual设为索引 merged_df = merged_df.set_index('member_casual')
方法2:使用join(需先统一索引)
先将每个DataFrame的索引设为member_casual,再通过join一次性合并:
# 分别设置索引 df_max = df_max.set_index('member_casual') df_avg = df_avg.set_index('member_casual') df_day = df_day.set_index('member_casual') # 合并 merged_df = df_max.join([df_avg, df_day])
二、用groupby一次性生成所有目标列(更高效)
其实不需要先拆分生成三个独立DataFrame,直接通过groupby配合agg方法,一次就能生成包含所有统计列的结果,步骤更简洁:
假设你的原始数据DataFrame为raw_df,包含member_casual、ride_length、day_of_week这几个核心列:
# 定义函数:获取出现次数最多的星期几(处理mode可能返回多个值的情况) def get_most_active_day(series): return series.mode().iloc[0] # 分组聚合一次性生成所有目标列 result_df = raw_df.groupby('member_casual').agg( max_ride_length=('ride_length', 'max'), # 计算最大骑行时长 avg_ride_length=('ride_length', 'mean'), # 计算平均骑行时长 most_active_day_of_week=('day_of_week', get_most_active_day) # 统计最活跃的星期几 )
关键说明:
agg方法接受一个字典,键是你想要生成的新列名,值是元组(原始列名,聚合函数)- 对于
most_active_day_of_week,因为mode()可能返回多个并列的结果,所以用iloc[0]取第一个结果保证返回单一值 - 最终的
result_df自动以member_casual为索引,直接包含你需要的三个统计列
内容的提问来源于stack exchange,提问作者BannyM
相关产品推荐
相关产品推荐

