Pandas表格重塑:含重复项的熔解与透视报错解决
解决Pandas pivot重复项报错的方案
原代码报错是因为pivot时,同一Date+Items组合对应多个variable值(比如4/04/2023的Paint对应James和Joe),导致无法重塑。要自动识别重复项并生成额外列,可按以下步骤修改:
修改后的完整代码
import pandas as pd data = [['4/04/2023','Floors','Tables','Roof','Paint','Paint'], ['4/05/2023','Roof','Floors','Tables','Roof','Paint'], ['4/06/2023','Paint','','Floors','Tables','Roof'], ['4/07/2023','Roof','Paint','','Floors','Tables']] df = pd.DataFrame(data, columns=['Date', 'Jim','Bob','Ed','James','Joe']) # 1. 宽表转长表,丢弃空值 df2 = df.melt(id_vars="Date", value_name='Items').dropna(subset=['Items']).reset_index(drop=True) # 2. 为每个Date+Items的重复项添加递增计数器 df2['count'] = df2.groupby(['Date', 'Items']).cumcount() + 1 # 从1开始编号,方便列名识别 # 3. 拼接Items与计数器,生成唯一列名 df2['Items_with_count'] = df2['Items'] + '_' + df2['count'].astype(str) # 4. 重新透视,此时无重复项冲突 df3 = df2.pivot(index="Date", columns='Items_with_count', values='variable') # 5. 整理列顺序,按Items类型分组排序 sorted_cols = sorted(df3.columns, key=lambda x: (x.split('_')[0], int(x.split('_')[1]))) df3 = df3[sorted_cols] print("原始表格:") print(df) print("\n转换后的目标表格:") print(df3)
关键逻辑说明
- 重复项标记:通过
groupby+cumcount为每组重复的Date+Items生成唯一序号,确保透视时不存在索引重复问题。 - 动态列生成:将Items与序号拼接成新列名(如
Paint_1、Paint_2),让重复内容自动分到不同列中。 - 列顺序优化:对生成的列按Items类型和序号排序,让输出结构更贴合目标表格的展示逻辑。
内容的提问来源于stack exchange,提问作者James C
相关产品推荐
相关产品推荐

