Python Pandas重新排序表

时间:2017-04-18 13:09:39

标签: python pandas dataframe

我在pandas中有一个如下所示的数据框:

ID     TIME         A            B            C
1      ddmmyy   value_of_A1   value_of_B1  value_of_C1
2      ddmmyy   value_of_A2   value_of_B2  value_of_C2
3      ddmmyy   value_of_A3   value_of_B3  value_of_C3

我希望将其变成一个如下所示的数据框:

ID     TIME       TYPE       VALUE
1      ddmmyy      A      value_of_A1
1      ddmmyy      B      value_of_B1
1      ddmmyy      C      value_of_C1
2      ddmmyy      A      value_of_A2
2      ddmmyy      B      value_of_B2
2      ddmmyy      C      value_of_C2
3      ddmmyy      A      value_of_A3
3      ddmmyy      B      value_of_B3
3      ddmmyy      C      value_of_C3

我怎么能用pandas和python来做呢?

谢谢你的帮助

2 个答案:

答案 0 :(得分:4)

melt使用sort_values

df = pd.melt(df, id_vars=['ID','TIME'], var_name='TYPE', value_name='VALUE')
       .sort_values(['ID','TYPE'])
print (df)
   ID    TIME TYPE        VALUE
0   1  ddmmyy    A  value_of_A1
3   1  ddmmyy    B  value_of_B1
6   1  ddmmyy    C  value_of_C1
1   2  ddmmyy    A  value_of_A2
4   2  ddmmyy    B  value_of_B2
7   2  ddmmyy    C  value_of_C2
2   3  ddmmyy    A  value_of_A3
5   3  ddmmyy    B  value_of_B3
8   3  ddmmyy    C  value_of_C3

替代:

df = df.rename_axis(['TYPE'], axis=1)
       .set_index(['ID','TIME'])
       .stack()
       .reset_index(name='VALUE')

print (df)
   ID    TIME TYPE        VALUE
0   1  ddmmyy    A  value_of_A1
1   1  ddmmyy    B  value_of_B1
2   1  ddmmyy    C  value_of_C1
3   2  ddmmyy    A  value_of_A2
4   2  ddmmyy    B  value_of_B2
5   2  ddmmyy    C  value_of_C2
6   3  ddmmyy    A  value_of_A3
7   3  ddmmyy    B  value_of_B3
8   3  ddmmyy    C  value_of_C3

答案 1 :(得分:2)

df.set_index(['ID','TIME']).stack().reset_index().rename(columns={'level_2':'TYPE',0:'VALUE'})

输出:

   ID    TIME TYPE        VALUE
0   1  ddmmyy    A  value_of_A1
1   1  ddmmyy    B  value_of_B1
2   1  ddmmyy    C  value_of_C1
3   2  ddmmyy    A  value_of_A2
4   2  ddmmyy    B  value_of_B2
5   2  ddmmyy    C  value_of_C2
6   3  ddmmyy    A  value_of_A3
7   3  ddmmyy    B  value_of_B3
8   3  ddmmyy    C  value_of_C3