我试图将最后两列转置为行。 这是我的样本
sample = {'ID' : [1,1,1,2,2,2,3,3,3],
'date' : [1,2,3,1,2,3,1,2,3],
'1st hour' : [111,121,131,211,221,231,311,321,331],
'2nd hour' : [112,122,132,212,222,232,312,322,332],
'3rd hour' : [113,123,133,213,223,233,313,323,333]
}
sample_df = pd.DataFrame(sample)
sample_df
我的输出应该如下:
sample = {'ID' : [1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3],
'date' : [1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,3,3,3],
'value' : [111,112,113,121,122,123,131,132,133,211,212,213,221,222,223,231,232,233,311,312,313,321,322,323,331,332,333]
}
sample_df = pd.DataFrame(sample)
sample_df
基本上,我只希望第一个数据的最后3列不在列中。
如果有人可以帮我解决这个问题,那就太棒了。 我提前感谢。
答案 0 :(得分:3)
使用melt
+ sort_values
:
df = sample_df.melt(id_vars=['ID','date']).drop('variable', 1).sort_values(['ID','date'])
#old version of pandas < 0.20.0
#df= pd.melt(sample_df, id_vars=['ID','date']).drop('variable', 1).sort_values(['ID','date'])
print (df.head(10))
ID date value
0 1 1 111
9 1 1 112
18 1 1 113
1 1 2 121
10 1 2 122
19 1 2 123
2 1 3 131
11 1 3 132
20 1 3 133
3 2 1 211
df = sample_df.set_index(['ID','date'])
.stack()
.reset_index(level=2, drop=True)
.reset_index(name='value')
print (df.head(10))
ID date value
0 1 1 111
1 1 1 112
2 1 1 113
3 1 2 121
4 1 2 122
5 1 2 123
6 1 3 131
7 1 3 132
8 1 3 133
9 2 1 211
答案 1 :(得分:2)
{{1}}
答案 2 :(得分:1)
实现这一目标的pythonic方法可能是将最后三列展平为:
>>> flatten = lambda l: [item for sublist in l for item in sublist]
>>> sample_df = [[111,112,113],[121,122,123],[131,132,133]]
>>> flatten(sample_df)
[111,112,113,121,122,123,131,132,133]
但是jezrael的回答可能是使用熊猫数据框架的更好选择。