如何使pandas groupby基于数据值而非索引分组生成目标DataFrame?
解决方案
你的问题出在df.groups返回的是分组对应的原数据索引集合,而非price列的数值,所以生成的DataFrame自然是索引值。要得到目标结构,可以通过给分组内的行添加序号后透视,或者用groupby结合unstack实现:
方法一:添加组内行号 + 透视
import pandas as pd # 构造原DataFrame(示例数据) my_old_df = pd.DataFrame({ 'date': [2006, 2007, 2007, 2006], 'price': [500, 2000, 3400, 5000] }) # 给每个年份分组内的行生成递增序号 my_old_df['row_id'] = my_old_df.groupby('date').cumcount() # 透视转换为目标结构:行是序号,列是年份,值是price my_desired_df = my_old_df.pivot( index='row_id', columns='date', values='price' ).reset_index(drop=True) # 去掉多余的row_id索引列 # 调整列顺序匹配你的目标(可选) my_desired_df = my_desired_df[[2007, 2006]] print(my_desired_df)
输出结果:
2007 2006 0 2000 500 1 3400 5000
方法二:Groupby + Unstack
# 直接对price列分组,将每组的price转为序列后unstack成列 my_desired_df = my_old_df.groupby('date')['price'].apply( lambda x: x.reset_index(drop=True) ).unstack() # 调整列顺序 my_desired_df = my_desired_df[[2007, 2006]]
关键说明
cumcount():给每个分组内的行从0开始编号,确保不同年份的price能按顺序对应到同一行pivot():将行转列的核心方法,通过指定索引、列、值三个参数完成结构转换unstack():把分组后的层级索引展开为列,适合这种分组后转列的场景
内容的提问来源于stack exchange,提问作者Yann
相关产品推荐
相关产品推荐

