Python Pandas中如何按列a分组并将列b转换为多列?
解决Pandas按列分组后拆分列值到多列的问题
你可以通过分组添加序号+透视表转换的方式实现需求,具体步骤如下:
1. 准备原数据
import pandas as pd import numpy as np df = pd.DataFrame({ 'a': [1, 2, 3, 4, 1, 2], 'b': [10, 20, 30, 40, 50, 60] })
2. 核心处理代码
# 为每个分组内的元素生成递增序号(从0开始) df['group_idx'] = df.groupby('a').cumcount() # 透视表转换:将序号转为列,拆分b列值到不同列 result_df = df.pivot(index='a', columns='group_idx', values='b').reset_index() # 重命名列名,匹配需求的b和b1 result_df.columns = ['a', 'b', 'b1'] # 缺失值自动填充为NaN(pivot默认已处理,此步可省略) result_df = result_df.fillna(np.nan)
3. 输出结果
执行后得到的result_df就是你需要的格式:
print(result_df) # a b b1 # 0 1 10 50.0 # 1 2 20 60.0 # 2 3 30 NaN # 3 4 40 NaN
原理说明
groupby('a').cumcount():给每个a分组内的元素分配唯一序号,同一a的多个b值会被标记为0、1、2...pivot:将序号作为列名,把同一a对应的不同b值映射到不同列,没有对应值的位置自动填充NaN- 最后通过重命名列名,得到符合要求的结构
如果你偏好更简洁的写法,也可以用groupby结合unstack实现:
result_df = df.groupby('a')['b'].apply(pd.Series).unstack() result_df.columns = ['b', 'b1'] result_df = result_df.reset_index().rename_axis(None, axis=1)
内容的提问来源于stack exchange,提问作者White cow
相关产品推荐
相关产品推荐

