如何用Python Pandas按共享Item ID将DataFrame行值转置为新列?
Pandas 实现重复Item ID的属性列转行
示例输入数据
假设你的原始DataFrame结构如下(以单属性列为例):
import pandas as pd data = { 'Item ID': ['A001', 'A001', 'A002', 'A002', 'A002'], 'Attribute': ['红色', '纯棉', '蓝色', '涤纶', '修身'] } df = pd.DataFrame(data)
核心解决方案
通过分组标记序号+透视表的方式,将同一Item ID的多行属性转为多列:
# 为每个Item ID的重复行生成递增序号(从1开始) df['attr_seq'] = df.groupby('Item ID').cumcount() + 1 # 透视转换:Item ID作为行索引,序号作为列,属性值填充单元格 pivot_df = df.pivot(index='Item ID', columns='attr_seq', values='Attribute') # 重命名列名,让格式更清晰 pivot_df.columns = [f'Attribute_{num}' for num in pivot_df.columns] # 重置索引,把Item ID从索引转回普通列 final_df = pivot_df.reset_index()
输出结果
运行后final_df的结构如下:
| Item ID | Attribute_1 | Attribute_2 | Attribute_3 |
|---|---|---|---|
| A001 | 红色 | 纯棉 | NaN |
| A002 | 蓝色 | 涤纶 | 修身 |
扩展:包含其他固定属性列的情况
如果你的DataFrame还有其他与Item ID一一对应的列(比如商品名称),可以先提取唯一信息再合并:
# 示例带额外列的输入 data = { 'Item ID': ['A001', 'A001', 'A002', 'A002', 'A002'], 'Name': ['T恤', 'T恤', '裤子', '裤子', '裤子'], 'Attribute': ['红色', '纯棉', '蓝色', '涤纶', '修身'] } df = pd.DataFrame(data) # 提取Item ID与固定属性的唯一对应关系 fixed_attr = df[['Item ID', 'Name']].drop_duplicates().set_index('Item ID') # 处理属性列转行 df['attr_seq'] = df.groupby('Item ID').cumcount() + 1 attr_pivot = df.pivot(index='Item ID', columns='attr_seq', values='Attribute') attr_pivot.columns = [f'Attribute_{num}' for num in attr_pivot.columns] # 合并固定属性与转换后的属性列 final_df = fixed_attr.join(attr_pivot).reset_index()
关键说明
groupby('Item ID').cumcount():用于标记每个Item ID下的行顺序,确保属性列按原始顺序排列pivot():是实现行转列的核心方法,自动将同一索引下的不同列值展开为多列- 若存在缺失值(如示例中A001只有2个属性),会用
NaN填充,可通过fillna('')替换为空字符串
内容的提问来源于stack exchange,提问作者strunge29
相关产品推荐
相关产品推荐

