如何将数据框的第一行转换为列
How to convert the first row of the dataframe to a column
我正在使用 pandas,我正在尝试将数据帧的第一行转换为一列,我尝试了 stack() 函数,但它看起来像 f%#¤ed。我不能真正使用 stack(),因为我有不同的 headers 列。比方说,您的数据框如下所示:(红色框:我的数据框的外观(黄色框:我希望我的数据框的外观)
如果你能帮助我,我将不胜感激。
干杯,
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')
我认为你需要:
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
编辑:
您需要通过参数 index_col
:
将第一列和第二列转换为 Multiindex
时出现问题
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
我正在使用 pandas,我正在尝试将数据帧的第一行转换为一列,我尝试了 stack() 函数,但它看起来像 f%#¤ed。我不能真正使用 stack(),因为我有不同的 headers 列。比方说,您的数据框如下所示:(红色框:我的数据框的外观(黄色框:我希望我的数据框的外观)
如果你能帮助我,我将不胜感激。
干杯,
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')
我认为你需要:
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
编辑:
您需要通过参数 index_col
:
Multiindex
时出现问题
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