我正在使用pandas,并且我试图将数据帧的第一行转换为列,我已经尝试了stack()函数,但它看起来像f%#¤ed。我不能真正使用stack()因为我有不同标题的列。比方说,您的数据框如下所示:(红色框:我的数据框看起来如何(黄色框:我希望我的数据框看起来如何)
如果你能帮助我,我很感激。
干杯,
答案 0 :(得分:2)
IIUC:
In [199]: df = pd.DataFrame(np.random.randint(5, size=(5,3)), columns=list('abc'))
In [200]: df
Out[200]:
a b c
0 4 4 0
1 3 3 0
2 4 3 3
3 3 2 0
4 1 0 4
In [201]: df.columns
Out[201]: Index(['a', 'b', 'c'], dtype='object')
In [202]: df, df.columns, df.columns.name = df.iloc[1:], df.iloc[0].astype(str), None
In [203]: df
Out[203]:
4 4 0
1 3 3 0
2 4 3 3
3 3 2 0
4 1 0 4
In [204]: df.columns
Out[204]: Index(['4', '4', '0'], dtype='object')
答案 1 :(得分:1)
我认为你需要:
df = df.stack().rename_axis(('a','b','c')).reorder_levels([2,0,1]).sort_index()
print (df)
c a b
2014 A A1 1
A1 9
B B1 9
B2 1
2015 A A1 5
A1 4
B B1 1
B2 7
2016 A A1 5
A1 1
B B1 6
B2 7
dtype: int64
如果columns
需要Multiindex
:
df = df.stack()
.rename_axis(('a','b','c'))
.reorder_levels([2,0,1])
.sort_index()
.reset_index(name='count')
print (df)
c a b count
0 2014 A A1 1
1 2014 A A1 9
2 2014 B B1 9
3 2014 B B2 1
4 2015 A A1 5
5 2015 A A1 4
6 2015 B B1 1
7 2015 B B2 7
8 2016 A A1 5
9 2016 A A1 1
10 2016 B B1 6
11 2016 B B2 7
编辑:
您需要通过参数Multiindex
将第一列和第二列转换为index_col
,这是一个问题:
tab3 = "C:\\Users\\abk29\\NordicMontlyDemand\\NordicDY\\Book1.xls"
df = pd.read_excel(tab3, sheetname="Sheet1", skiprows=2, index_col=[0,1])
print (df)
2016 2017 2018
Unnamed: 1
A A1 1 1 1
A2 2 2 2
B B1 3 3 3
B2 4 4 4
df = df.stack().rename_axis(('a','b','c')).reorder_levels([2,0,1]).sort_index()
print (df)
c a b
2016 A A1 1
A2 2
B B1 3
B2 4
2017 A A1 1
A2 2
B B1 3
B2 4
2018 A A1 1
A2 2
B B1 3
B2 4
dtype: int64