我有一个像这样的数据框
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
有没有更好,更压缩的方法来做到这一点?不用说,当有很多列时,这会变得很麻烦。
答案 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