2017-12-16 8 views

答えて

3

まずset_index、その後stackrename_axisと最後reset_index

df = df.set_index('Year').stack().rename_axis(('Year','Type')).reset_index(name='Value') 
print (df) 
    Year Type Value 
0 1999 A  1 
1 1999 B  3 
2 1999 C  5 
3 1999 D  7 
4 2000 A  11 
5 2000 B  13 
6 2000 C  17 
7 2000 D  19 
8 2001 A  23 
9 2001 B  29 
10 2001 C  31 
11 2001 D  37 

またはmeltを使用しますが、値の順序が異なっている:

df = df.melt('Year', var_name='Type', value_name='Value') 
print (df) 
    Year Type Value 
0 1999 A  1 
1 2000 A  11 
2 2001 A  23 
3 1999 B  3 
4 2000 B  13 
5 2001 B  29 
6 1999 C  5 
7 2000 C  17 
8 2001 C  31 
9 1999 D  7 
10 2000 D  19 
11 2001 D  37 

...ので、必要なソートは次のとおりです。

df = (df.melt('Year', var_name='Type', value_name='Value') 
     .sort_values(['Year','Type']) 
     .reset_index(drop=True)) 
print (df) 
    Year Type Value 
0 1999 A  1 
1 1999 B  3 
2 1999 C  5 
3 1999 D  7 
4 2000 A  11 
5 2000 B  13 
6 2000 C  17 
7 2000 D  19 
8 2001 A  23 
9 2001 B  29 
10 2001 C  31 
11 2001 D  37 

numpyのソリューション:

a = np.repeat(df['Year'], len(df.columns.difference(['Year']))) 
b = np.tile(df.columns.difference(['Year']), len(df.index)) 
c = df.drop('Year', 1).values.ravel() 

df = pd.DataFrame(np.column_stack([a,b,c]), columns=['Year','Type','Value']) 
print (df) 
    Year Type Value 
0 1999 A  1 
1 1999 B  3 
2 1999 C  5 
3 1999 D  7 
4 2000 A 11 
5 2000 B 13 
6 2000 C 17 
7 2000 D 19 
8 2001 A 23 
9 2001 B 29 
10 2001 C 31 
11 2001 D 37 
3

あなたのDF

pd.DataFrame({'Year':df.Year.repeat((df.shape[1]-1)),'Type':list(df)[1:]*len(df),'Value':np.concatenate(df.iloc[:,1:].values)}) 

Out[95]: 
    Type Value Year 
0 A  1 1999 
0 B  3 1999 
0 C  5 1999 
0 D  7 1999 
1 A  11 2000 
1 B  13 2000 
1 C  17 2000 
1 D  19 2000 
2 A  23 2001 
2 B  29 2001 
2 C  31 2001 
2 D  37 2001 
+0

を再作成し、列の順序を変更することができます;) – jezrael

+0

、それはソートらしい... – jezrael

+0

@jezraelなるほど、あなたは正しい、繰り返しを使用してください。 - ) – Wen

関連する問題