Excel 文件中的 pandas 数据帧中的双 "melt"
Double "melt" in a pandas dataframe from Excel file
我正在阅读 pandas 中的一个 excel 文件,其中包含两个级别的列。我正在使用 Python 3.7
Example Excel file
Unnamed: 0 Unnamed: 1 Unnamed: 2 2021-01-01 2021-01-02 2021-01-03 2021-01-04 2021-01-05
0 ProjectNr Name Sector categorya categoryb categoryc categoryd categorye
1 1 aaa A1 14.995 14.995 14.995 14.995 14.995
2 2 aaa A2 7.4975 7.4975 7.4975 NaN NaN
3 3 aaa A3 NaN 11.996 11.996 11.996 NaN
我想将行“类别”和“日期”转换为数据框的不同列。我尝试使用 melt 但我不知道如何进行第二次熔化或熔化到组合行 headers.
我想得到类似的东西
ProjectNr Name Sector Category date Price
1 aaa A1 categorya 01/01/2021 € 15,00
1 aaa A1 categoryb 02/01/2021 € 15,00
1 aaa A1 categoryc 03/01/2021 € 15,00
1 aaa A1 categoryd 04/01/2021 € 15,00
1 aaa A1 categorye 05/01/2021 € 15,00
2 aaa A2 categorya 01/01/2021 € 7,50
2 aaa A2 categoryb 02/01/2021 € 7,50
2 aaa A2 categoryc 03/01/2021 € 7,50
2 aaa A2 categoryd 04/01/2021
2 aaa A2 categorye 05/01/2021
3 aaa A3 categorya 01/01/2021
3 aaa A3 categoryb 02/01/2021 € 12,00
3 aaa A3 categoryc 03/01/2021 € 12,00
3 aaa A3 categoryd 04/01/2021 € 12,00
3 aaa A3 categorye 05/01/2021
如果我使用 header=[0, 1] 创建 df,则 melt broke 包含列的名称。
如果没有 header,熔化仅适用于一列。
示例:
Unnamed: 0 Unnamed: 1 Unnamed: 2 dt value
0 ProjectNr Name Sector 2021-01-01 categorya
1 1 aaa A1 2021-01-01 14.995
2 2 aaa A2 2021-01-01 7.4975
3 3 aaa A3 2021-01-01 NaN
4 ProjectNr Name Sector 2021-01-02 categoryb
5 1 aaa A1 2021-01-02 14.995
6 2 aaa A2 2021-01-02 7.4975
如何为 header 的两个级别进行熔化?
首先,我们需要正确读取excel文件
df = pd.read_excel('~/test.xlsx', header=[0, 1], index_col=[0, 1, 2])
使用您需要保持 NaN
的 MultiIndex
级别堆叠,然后重置索引
df = df.stack(level=[1, 0], dropna=False).reset_index()
最后,重命名列
df.columns = ['ProjectNr', 'Name', 'Sector', 'Category', 'date', 'Price']
我正在阅读 pandas 中的一个 excel 文件,其中包含两个级别的列。我正在使用 Python 3.7
Example Excel file
Unnamed: 0 Unnamed: 1 Unnamed: 2 2021-01-01 2021-01-02 2021-01-03 2021-01-04 2021-01-05
0 ProjectNr Name Sector categorya categoryb categoryc categoryd categorye
1 1 aaa A1 14.995 14.995 14.995 14.995 14.995
2 2 aaa A2 7.4975 7.4975 7.4975 NaN NaN
3 3 aaa A3 NaN 11.996 11.996 11.996 NaN
我想将行“类别”和“日期”转换为数据框的不同列。我尝试使用 melt 但我不知道如何进行第二次熔化或熔化到组合行 headers.
我想得到类似的东西
ProjectNr Name Sector Category date Price
1 aaa A1 categorya 01/01/2021 € 15,00
1 aaa A1 categoryb 02/01/2021 € 15,00
1 aaa A1 categoryc 03/01/2021 € 15,00
1 aaa A1 categoryd 04/01/2021 € 15,00
1 aaa A1 categorye 05/01/2021 € 15,00
2 aaa A2 categorya 01/01/2021 € 7,50
2 aaa A2 categoryb 02/01/2021 € 7,50
2 aaa A2 categoryc 03/01/2021 € 7,50
2 aaa A2 categoryd 04/01/2021
2 aaa A2 categorye 05/01/2021
3 aaa A3 categorya 01/01/2021
3 aaa A3 categoryb 02/01/2021 € 12,00
3 aaa A3 categoryc 03/01/2021 € 12,00
3 aaa A3 categoryd 04/01/2021 € 12,00
3 aaa A3 categorye 05/01/2021
如果我使用 header=[0, 1] 创建 df,则 melt broke 包含列的名称。 如果没有 header,熔化仅适用于一列。 示例:
Unnamed: 0 Unnamed: 1 Unnamed: 2 dt value
0 ProjectNr Name Sector 2021-01-01 categorya
1 1 aaa A1 2021-01-01 14.995
2 2 aaa A2 2021-01-01 7.4975
3 3 aaa A3 2021-01-01 NaN
4 ProjectNr Name Sector 2021-01-02 categoryb
5 1 aaa A1 2021-01-02 14.995
6 2 aaa A2 2021-01-02 7.4975
如何为 header 的两个级别进行熔化?
首先,我们需要正确读取excel文件
df = pd.read_excel('~/test.xlsx', header=[0, 1], index_col=[0, 1, 2])
使用您需要保持 NaN
的 MultiIndex
级别堆叠,然后重置索引
df = df.stack(level=[1, 0], dropna=False).reset_index()
最后,重命名列
df.columns = ['ProjectNr', 'Name', 'Sector', 'Category', 'date', 'Price']