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

如何用Pandas将长表转为以acc为行、date为列的宽表?

问题描述

现有如下示例DataFrame(df):

date(YYYY-mm-dd)   money   money_diff        acc
2019-02-01          110      diff_1      236234623-1
2019-03-01          244      diff_2      236234623-1
2019-04-01          402      diff_3      236234623-1
2019-02-01          429      diff_4      876567856-k
2019-03-01          424      diff_5      876567856-k
2019-04-01          125      diff_6      876567856-k
2019-08-01          346      diff_7      876567856-k
    ...             ...       ...
2020-01-01          348      diff_20     456745675-5
2020-02-01          745      diff_21     456745675-5
2020-03-01          457      diff_22     456745675-5
2020-04-01          567      diff_23     023603460-0
2020-05-01          774      diff_24     0236034060-0
   ...              ...       ...            ...
2023-01-01          245      diff_43     634034060-3
2023-02-01          458      diff_44     634034060-3
2023-03-01          457      diff_45     634034060-3

需求:将acc列作为第一列(值唯一),date列的值作为其他表头,表内填充money_diff列的值,可丢弃money列。期望得到如下表格结构:

acc                 2019-02-01    2019-03-01     2019-04-01   ...   2023-03-01
     236234623-1              diff_1        diff_2         diff_3     ...    diff_X1
     876567856-k              diff_4        diff_5         diff_6     ...    diff_X2
     456745675-5              diff_X3       diff_X4        diff_X5    ...    diff_X6
     023603460-0              diff_X6       diff_X7        diff_X8    ...    diff_X9
     634034060-3              diff_X10      diff_X11       diff_X12   ...    diff_45

尝试使用pd.melt函数但未得到预期结果,错误代码:

pd.melt(df, id_values='acc', var_values='money_diff','date')
正确实现方法

你用反了函数:pd.melt是把宽表转成窄长表的工具,而你需要的是把当前的窄长表转成宽表,应该用pivot或者pivot_table。

方法1:用pivot(推荐,因为每个acc+date组合唯一)

# 先删掉不需要的money列,再做透视
result = df.drop('money', axis=1).pivot(index='acc', columns='date(YYYY-mm-dd)', values='money_diff')

# 如果想把acc从索引转回普通列,加下面这行
result = result.reset_index()

方法2:用pivot_table(适合有重复acc+date的场景,这里也能用)

result = df.pivot_table(index='acc', columns='date(YYYY-mm-dd)', values='money_diff', aggfunc='first')
result = result.reset_index()

执行后就能得到你要的结构:acc作为第一列,各个日期是表头,单元格对应填充money_diff的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 07:53:13