仅将几列转换为行,而将其余列保留为列 - python

时间:2017-11-04 19:39:19

标签: python pandas dataframe transpose

我试图将最后两列转置为行。 这是我的样本

    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列不在列中。

如果有人可以帮我解决这个问题,那就太棒了。 我提前感谢。

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

set_index + stack

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的回答可能是使用熊猫数据框架的更好选择。