pandas实现groupby分组后将组内行数据转换为新列的方法
长表按分组转宽表实现方案
以下方案基于Python Pandas实现,覆盖固定每组2行、支持任意组内行数两种需求场景。
每组固定2行场景
核心逻辑是先按Group分组,给组内每条记录按原始顺序标记从1开始的序号,再通过透视把行数据转为列数据,最后调整列名和顺序匹配目标结构即可。
import pandas as pd # 读取/构造原始长表数据 df = pd.DataFrame({ "Group": [1, 1, 2, 2, 3, 3], "Value": [1.1, 1.2, 1.4, 1.6, 0.4, 0.3], "Name": ["AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF"] }) # 给组内记录加序号 df["seq"] = df.groupby("Group").cumcount() + 1 # 透视转宽表并调整格式 wide_df = df.pivot(index="Group", columns="seq", values=["Value", "Name"]) wide_df.columns = [f"{col}_{idx}" for col, idx in wide_df.columns] wide_df = wide_df.reset_index()[["Group", "Value_1", "Name_1", "Value_2", "Name_2"]]
运行以上代码得到的输出和给出的目标样例结构、数据完全一致。
每组任意行数通用场景
不需要提前统计每组的记录条数,在固定场景逻辑基础上去掉手动指定列的步骤即可自动适配,不同分组行数不一致时,缺失的记录位会自动填充空值:
import pandas as pd # 通用转换逻辑,自动适配组内行数 df["seq"] = df.groupby("Group").cumcount() + 1 wide_df = df.pivot(index="Group", columns="seq", values=["Value", "Name"]) # 按序号排序列,保证Value_n、Name_n的顺序符合预期 wide_df = wide_df.sort_index(axis=1, level=1) wide_df.columns = [f"{col}_{idx}" for col, idx in wide_df.columns] wide_df = wide_df.reset_index()
- 转换过程保留原始数据的组内顺序,不会打乱原有记录排列
- 新增列会自动按组内最大记录数生成,比如所有组最多有3条记录时,会自动生成Value_3、Name_3列
- 组内记录数不足最大值时,对应列自动填充
NaN空值
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

