Pandas 如何将列标题转换为列
我有一个熊猫数据框,看起来像这样:Pandas 如何将列标题转换为列,pandas,Pandas,我有一个熊猫数据框,看起来像这样: Year A B C D 1999 1 3 5 7 2000 11 13 17 19 2001 23 29 31 37 Year Type Value 1999 A 1 1999 B 3 1999 C 5 1999 D 7 2000 A 11 2000 B 13 我希望它看起来像这样: Year A B C D 1999 1 3 5 7 2000
Year A B C D
1999 1 3 5 7
2000 11 13 17 19
2001 23 29 31 37
Year Type Value
1999 A 1
1999 B 3
1999 C 5
1999 D 7
2000 A 11
2000 B 13
我希望它看起来像这样:
Year A B C D
1999 1 3 5 7
2000 11 13 17 19
2001 23 29 31 37
Year Type Value
1999 A 1
1999 B 3
1999 C 5
1999 D 7
2000 A 11
2000 B 13
等等。是否有办法做到这一点,如果有,如何做到?首先,然后,最后:
或使用,但值的顺序不同:
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
首先,然后,最后:
或使用,但值的顺序不同:
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
您可以重新创建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
您可以重新创建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
和列的更改顺序;)@jezrael aha,您是对的,应该使用repeat:-)并更改列的顺序;)@耶斯雷尔:啊哈,你说得对,应该使用重复:-)