在Python的Pandas中融合或堆叠列组

2024-10-04 05:28:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个像这样的熊猫数据帧

year  id1  id2  jan jan1 jan2 feb feb1 feb2 mar mar1 mar2 ....
2018   01   10    3   30   31   2   23   25   7   52   53 ....
2018   01   20    ....
2018   02   10    ....
2018   02   20    ....

我需要这种格式

^{pr2}$

如您所见,我每个月有3个值,并且我只添加一个分配给该月的列,其中有3列用于值。如果只有一列,我想我可以使用stack。在

将month列重命名为01 01-1 01-2(对于一月)或类似的名称以使其更简单,我不会有任何问题。在

我也在考虑将3个不同数据帧上的信息分别分离到stack它们,然后merge结果,或者我应该melt它?在

有什么办法可以轻松实现这一点?在


Tags: 数据stack格式yearmarjanfebid2
2条回答

使用reshapestack

pd.DataFrame(df.set_index(['year','id1','id2']).values.reshape(4,3,3).tolist(),
index=df.set_index(['year','id1','id2']).index,
     columns=[1,2,3])\
       .stack().apply(pd.Series).reset_index().rename(columns={'level_3':'month'})

Out[261]: 
    year  id1  id2  month  0   1   2
0   2018    1   10      1  3  30  31
1   2018    1   10      2  2  23  25
2   2018    1   10      3  7  52  53
3   2018    1   20      1  3  30  31
4   2018    1   20      2  2  23  25
5   2018    1   20      3  7  52  53
6   2018    2   10      1  3  30  31
7   2018    2   10      2  2  23  25
8   2018    2   10      3  7  52  53
9   2018    2   20      1  3  30  31
10  2018    2   20      2  2  23  25
11  2018    2   20      3  7  52  53

所以我用这种方式重命名了标题列

                 01   01   01  02   02   02  03   03   03  ...
year  id1  id2  val val1 val2 val val1 val2 val val1 val2 ....
2018   01   10    3   30   31   2   23   25   7   52   53 ....
2018   01   20    ....
2018   02   10    ....
2018   02   20    ....

以这种方式打开文件

^{pr2}$

然后,我实际上只需要stack它在0级

df = df.stack(level=0)

加上标题

df.index.names = ['year','id1','id2','month']
df = df.reset_index()

相关问题 更多 >