Pandas单列生成透视表返回多组同名列值结果异常问题
问题原因
你之前的pivot用法不符合需求逻辑:pivot默认会把传入columns参数的字段的所有唯一值(或多字段组合值)拆分为独立列,不会按分组内的记录序号配对Date和Note字段,因此会出现所有日期列在前、所有分数列在后的错位结构,和你要的按记录序号成对排列的Date_n/Note_n格式不匹配。
正确实现方案
核心思路是先按Animal分组,给组内每条记录按日期从新到旧编排序号,再以序号为维度做宽表转换,最后调整列名和顺序即可。
完整代码如下:
import pandas as pd # 1. 预处理:对齐列名、转换日期格式 df = df.rename(columns={'score':'Note'}) # 原数据score列对应输出的Note列 df['Date'] = pd.to_datetime(df['Date']) # 转日期类型方便排序 # 2. 分组生成组内序号:按日期降序排,同组日期从新到旧编号从1开始 df['seq'] = df.groupby('Animal')['Date'].rank(ascending=False, method='first').astype(int) # 3. 透视转宽表 pivot_res = df.pivot(index='Animal', columns='seq', values=['Date', 'Note']) # 4. 调整列名和列顺序,保证同序号的Date、Note相邻 pivot_res.columns = [f'{col[0]}_{col[1]}' for col in pivot_res.columns] # 按列尾的序号排序,避免所有Date列集中在前、Note列集中在后 pivot_res = pivot_res.reindex( sorted(pivot_res.columns, key=lambda x: int(x.split('_')[-1])), axis=1 ).reset_index() # 5. 可选:把日期格式转回M/D/YY的短文本格式,和示例输出完全一致 date_cols = [c for c in pivot_res.columns if c.startswith('Date_')] for c in date_cols: pivot_res[c] = pivot_res[c].dt.strftime('%-m/%-d/%y')
运行后输出结果和预期完全一致:
Animal Date_1 Note_1 Date_2 Note_2 Date_3 Note_3 0 Cat 3/1/22 Pass 2/28/22 Fail 2/1/22 Pass 1 Dog 2/4/22 Fail 2/3/22 Pass NaN NaN
如果不需要按日期排序,想保留原数据的行顺序生成编号,去掉日期转换、排序相关步骤,直接用
cumcount()生成序号即可:df['seq'] = df.groupby('Animal').cumcount().add(1)
内容的提问来源于stack exchange,提问作者AlmostThere
相关产品推荐
相关产品推荐

