如何按DataFrame的A列分组,保留顺序生成B列的嵌套列表?
解决方法:Pandas按A列分组生成指定嵌套列表
没问题,这个需求用Pandas可以轻松实现,而且能完美满足你对顺序的要求,我给你几个实用的方案:
首先构造示例DataFrame
先把你给出的数据转换成Pandas的DataFrame,方便后续操作:
import pandas as pd df = pd.DataFrame({ 'A': [1, 1, 2, 2, 2, 3, 3, 4, 4], 'B': [3, 4, 5, 8, 6, 6, 8, 10, 1] })
方案一:groupby + apply(list)
这是最直观的方法,核心是用groupby按A列分组,再把每个分组的B列转成列表,同时确保分组顺序和原数据一致:
# sort=False 是关键!保证分组顺序和A列元素首次出现的顺序一致 grouped_data = df.groupby('A', sort=False)['B'].apply(list) # 转成你要的嵌套列表格式 result = grouped_data.tolist() print(result) # 输出:[[3, 4], [5, 8, 6], [6, 8], [10, 1]]
这里的sort=False一定要加上,如果不加的话,Pandas默认会对分组键(A列)进行排序,要是你原数据里A列的分组不是按数字顺序出现的,结果的子列表顺序就会乱掉。而apply(list)会严格保留每个分组里B列元素的原有顺序,完全符合你的要求。
方案二:groupby + agg(list)
这个方案更简洁,效果和上面完全一样,用agg()替代apply():
result = df.groupby('A', sort=False)['B'].agg(list).tolist()
agg(list)在这里的作用就是把每个分组的B列元素聚合为列表,代码更短,可读性也很强。
额外说明
如果你用的是较新版本的Pandas(1.3.0及以上),也可以通过groups属性实现,但相比前两种方法稍显繁琐,这里也给你参考下:
result = [df.loc[group_indices, 'B'].tolist() for _, group_indices in df.groupby('A', sort=False).groups.items()]
不管用哪种方法,最终得到的结果都是你想要的嵌套列表,而且完全保留了B列元素的原有顺序,子列表的顺序也和A列的分组顺序完全一致。
内容的提问来源于stack exchange,提问作者Eleanor
相关产品推荐
相关产品推荐

