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

Pandas如何将列中唯一值转置为新列完成dataframe结构转换

问题原因

直接调用pivot得到不符合预期的结果,核心原因是原始数据是无显式分组标识的长表结构:每连续5行对应1条完整交易记录,但没有字段标记哪些行归属同一条交易,pivot默认按原索引逐行匹配列值,就会生成大量空值。

实现方法

不需要复杂的groupby聚合,按以下逻辑操作即可:

  • 给每条交易生成唯一分组ID:根据数据规律,每条交易固定以Date of transaction开头,既可以按固定5行的规律快速分组,也可以通过识别起始行生成适配不规则数据的分组ID,同时保留每组第一行的原索引,匹配你预期结果的行号。
  • 执行透视转换:以分组ID为行索引、c1字段值为列名、c2字段值为单元格内容做透视,最后调整列顺序、清除多余轴标签即可。
完整可运行代码
import pandas as pd
import numpy as np

# 构造原始示例数据
df = pd.DataFrame({
    'c1': ['Date of transaction','Deposit amount','Withdrawal amount','Balance','Comments',
           'Date of transaction','Deposit amount','Withdrawal amount','Balance','Comments'],
    'c2': ['2021-04-26','10,000',np.nan,'10,000','store_a',
           '2021-04-26','20,000',np.nan,'21,000','store_b']
})

# 通用分组逻辑:每次遇到交易日期行就记为新分组,不依赖固定行数
df['record_id'] = (df['c1'] == 'Date of transaction').cumsum() - 1
# 提取每组第一行的原索引,作为最终结果的行号
target_index = df.groupby('record_id').apply(lambda x: x.index[0]).values

# 透视转宽表
result = df.pivot(index='record_id', columns='c1', values='c2')
# 调整行索引、列顺序,匹配预期格式
result.index = target_index
result = result[['Date of transaction','Deposit amount','Withdrawal amount','Balance','Comments']]
result.columns.name = None

print(result)
输出结果
Date of transaction Deposit amount Withdrawal amount Balance Comments
0          2021-04-26         10,000               NaN  10,000  store_a
5          2021-04-26         20,000               NaN  21,000  store_b

内容的提问来源于stack exchange,提问作者superccccc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:01:01