【问题标题】:Python pandas convert multiple headers in excel file into columnsPython pandas将excel文件中的多个标题转换为列
【发布时间】:2026-01-01 15:00:01
【问题描述】:

我一直在寻找一种使用 pandas 库将具有多个标题的 Excel 文件转换为列标题的方法。

通过读取文件并使用 ExcelFile 解析它,我已成功将数据导入数据框。我还能够使用 header=[0, 4] 来识别标题。我遇到问题的地方是重新索引和/或使用 melt 函数将标题转换为列。

当我使用 melt 功能时,我能够成功地将列转换为行。但是,我希望标题是单列,而不是与其余数据堆叠在一起。

目前,数据的结构是这样的:

Excel file displaying data with multiple headers

转换后的数据应该是这样的:

Data that is unpivot with headers converted into columns

我一直在阅读有关索引的内容,但不确定我是否理解它在此处的应用方式。

我是 python 新手,非常新,非常感谢任何支持或指导。我一直在阅读以下备忘单,但没有找到正确的转换方法:

https://www.datacamp.com/community/data-science-cheatsheets

这是一个示例代码:

import pandas as pd

xl = pd.ExcelFile('help.xlsx')
df1 = xl.parse('Sheet1')

df2 = pd.melt(df1,
          id_vars=['PW'],
          value_vars=['Fruit','Conventional'])

另外,在运行代码后添加结果: df1 the data with multiple headers

以下是数据的错误(标题没有转换成列,标题与其余数据堆叠在一起):

after using pandas melt the headers are stacked with the data and not converted into their own column

这是最终产品的外观:

Headers converted into columns

【问题讨论】:

  • 您是否有任何代码可以显示到目前为止的问题状态?

标签: python excel pandas dataframe


【解决方案1】:

试试这个:

# In[1]:
df = pd.read_excel('help.xlsx', header=[0,1,2,3]) #Read file, use 4 rows as header
df.columns = df.columns.map(','.join) #Concatenate by ',' the fields name
df = df.rename_axis('PW').reset_index() #reset and rename index
df2 = pd.melt(df, id_vars=list(df.columns)[0], value_vars=list(df.columns)[1:], value_name='Volume') #Unpivot table, g roping by 'variable' and 'volume'
df2[['Category', 'Field_Type', 'Growing_Method', 'Product']] = df2['variable'].str.split(',',expand=True) #Split using ',' as delimeter
df2.__delitem__('variable') #Delete extra field 'variable'
#Reorder Columns
cols = df2.columns.tolist() 
df2 = df2[[cols[0]] + cols[2:] + [cols[1]]]
df2

【讨论】:

  • 当我运行此代码时,结果数据框中不存在“PW”数据值。我的印象是问题作者希望包含这些数据。
  • 是因为melt方法重置了索引。我修好了!
【解决方案2】:

完成此类重塑的一种方法是使用pandasstack 操作:

import pandas as pd

# Read excel file. Use first column as row index, and use first four rows as
# column index levels
df = pd.read_excel('test.xlsx', index_col=0, header=[0, 1, 2, 3])

# Assign names to row index and column index levels
df.index.name = 'PW'
df.columns.names = ['Category', 'Field_Type', 'Growing_Method', 'Product']

# Convert all column index levels into row index levels
s = df.stack([0, 1, 2, 3])

# Assign name to the single data values column
s.name = 'Volume'

【讨论】:

    最近更新 更多