如何使用Pandas将DataFrame同组多行数据转换为单行?
解决Pandas DataFrame按组转宽表的问题
嘿,这个需求其实很常见,用Pandas的分组和重塑功能就能轻松搞定!我给你一步步拆解怎么做:
首先,先把你的原始数据用代码复现出来,方便我们测试:
import pandas as pd # 你的原始DataFrame df = pd.DataFrame({ 'a': [1, 1, 1, 1, 2, 2, 2], 'b': [10, 30, 60, 80, 10, 60, 80], 'c': [20, 40, 70, 100, 20, 70, 100] })
接下来核心步骤:
给每组添加行编号:我们需要给每个
a值对应的行标记顺序(1、2、3...),这样才能把同组的b、c分别转成b1、c1、b2、c2这类列:# 按a分组后,给每行从1开始计数 df['row_num'] = df.groupby('a').cumcount() + 1转成宽表格式:用
pivot函数把行转成列,以a为索引,row_num为列,b和c为值:wide_df = df.pivot(index='a', columns='row_num', values=['b', 'c'])整理列名:这时候列名是多层的(比如
('b', 1)),我们把它合并成你要的b1、c1格式:wide_df.columns = [f'{col}{num}' for col, num in wide_df.columns]收尾处理:把
a从索引变回普通列,同时给缺失的位置填充NA(对应第二组只有3行的情况):wide_df = wide_df.reset_index().fillna(pd.NA)
现在你打印wide_df,就得到了你想要的结果:
a b1 c1 b2 c2 b3 c3 b4 c4 0 1 10 20 30 40 60 70 80 100 1 2 10 20 60 70 80 100 <NA> <NA>
如果你的数据量很大,这个方法效率也很高,因为都是Pandas的内置向量操作,比循环快多啦~
内容的提问来源于stack exchange,提问作者Florian Bernard
相关产品推荐
相关产品推荐

