在python pandas上熔化或堆叠列组

时间:2017-11-23 19:41:59

标签: python pandas dataframe

我有像这样的pandas DataFrame

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    ....

我需要这种格式

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

如您所见,我每个月有3个值,我只添加一个分配给月份的列,其中3列为值。如果它只是一列,我想我可以使用stack

我将把月份列重命名为01 01-1 01-2(1月份)或类似的内容以使其更容易,我没有任何问题。

我也在考虑将3个不同数据框架上的信息分别stack分开,然后merge结果,或者我应该melt吗?

有什么想法可以轻松实现这一目标吗?

2 个答案:

答案 0 :(得分:0)

使用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

答案 1 :(得分:0)

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

                 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    ....

在一个文件上,并以这种方式打开

df = pd.read_csv('my_file.csv',header=[0, 1], index_col=[0,1,2], skipinitialspace=True, tupleize_cols=True)
df.columns = pd.MultiIndex.from_tuples(df.columns)

然后,我实际上只需要{0}上的stack

df = df.stack(level=0)

并添加标题

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