You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:42:23