我有像这样的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
吗?
有什么想法可以轻松实现这一目标吗?
答案 0 :(得分:0)
使用reshape
和stack
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()