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:-)并更改列的顺序;)@耶斯雷尔:啊哈,你说得对,应该使用重复:-)