まずset_index
、その後stack
、rename_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
を再作成し、列の順序を変更することができます;) – jezrael
、それはソートらしい... – jezrael
@jezraelなるほど、あなたは正しい、繰り返しを使用してください。 - ) – Wen