将数据帧列标题转换为Python中的行条目

时间:2017-12-13 10:03:33

标签: python pandas dataframe

我有一个像这样的数据框

import pandas as pd

year = [2005, 2006, 2007]
A = [4, 5, 7]
B = [3, 3, 9]
C = [1, 7, 6]
df_old = pd.DataFrame({'year' : year, 'A' : A, 'B' : B, 'C' : C})

Out[25]: 
   A  B  C  year
0  4  3  1  2005
1  5  3  7  2006
2  7  9  6  2007

我想将其转换为新的数据框,其中列标题“A”,“B”和“C”在行中。我有这个黑客,哪个工作

df_new = pd.DataFrame({'year' : list(df_old['year']) + list(df_old['year'])\
                       + list(df_old['year']),
                       'col' : ['A']*len(df_old['A']) + ['B']*len(df_old['B'])\
                       + ['C']*len(df_old['C']),
                       'val' : list(df_old['A']) + list(df_old['B'])\
                       + list(df_old['C'])})

Out[27]: 
  col  val  year
0   A    4  2005
1   A    5  2006
2   A    7  2007
3   B    3  2005
4   B    3  2006
5   B    9  2007
6   C    1  2005
7   C    7  2006
8   C    6  2007

有没有更好,更压缩的方法来做到这一点?不用说,当有很多列时,这会变得很麻烦。

1 个答案:

答案 0 :(得分:2)

使用melt

print (df_old.melt('year', value_name='val', var_name='col'))
   year col  val
0  2005   A    4
1  2006   A    5
2  2007   A    7
3  2005   B    3
4  2006   B    3
5  2007   B    9
6  2005   C    1
7  2006   C    7
8  2007   C    6

并重新排序列reindex

df=df_old.melt('year',value_name='val', var_name='col').reindex(columns=['col','val','year'])
print (df)
  col  val  year
0   A    4  2005
1   A    5  2006
2   A    7  2007
3   B    3  2005
4   B    3  2006
5   B    9  2007
6   C    1  2005
7   C    7  2006
8   C    6  2007