如何在Pandas中按列GroupBy、排序后将列值合并为列表
Pandas按ID分组后将列值合并为有序列表的实现方案
完整实现代码
import pandas as pd # 初始数据 df = pd.DataFrame( { "id" : [2957, 1456, 2223, 1456, 1456, 2957, 2223, 2957, 2223] , "year" : [2018, 2015, 2018, 2016, 2017, 2016, 2017, 2017, 2016], "rating" : [3, 1, 2, 2, 3, 2, 3, 1, 1] } ) # 步骤1:按id和year升序排序,确保分组内年份顺序正确 df_sorted = df.sort_values(by=['id', 'year']) # 步骤2:按id分组,将year和rating列值合并为列表 result = df_sorted.groupby('id', as_index=False).agg({ 'year': list, 'rating': list }) print(result)
执行结果
id year rating 0 1456 [2015, 2016, 2017] [1, 2, 3] 1 2223 [2016, 2017, 2018] [1, 3, 2] 2 2957 [2016, 2017, 2018] [2, 1, 3]
关键逻辑说明
- 排序环节:先对整个DataFrame按
id和year升序排序,保证每个id对应的所有行已经按年份从小到大排列,后续分组生成的列表顺序才符合需求。 - 分组聚合:使用
groupby('id')按id分组,通过agg()方法指定对year和rating列分别应用list函数,直接将分组内的列值按顺序转换为列表。as_index=False用于保留id作为普通列,与期望结果结构一致。
备选实现方式(灵活但性能略低)
如果需要自定义更多逻辑,也可以使用apply()方法:
result = df_sorted.groupby('id', as_index=False).apply( lambda x: pd.Series({ 'year': x['year'].tolist(), 'rating': x['rating'].tolist() }) )
内容的提问来源于stack exchange,提问作者Matthew Smith
相关产品推荐
相关产品推荐

