如何用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
相关产品推荐
相关产品推荐

