Python pandas将excel文件中的多个标头转换为列

时间:2018-01-06 00:16:57

标签: python excel pandas dataframe

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

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

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

目前,这是数据的结构:

Excel file displaying data with multiple headers

转换后,数据应如下所示:

Data that is unpivot with headers converted into columns

我一直在阅读关于索引的内容,但不确定我是否理解它将如何适用于此。

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

完成此类重塑的一种方法是使用function getAccountBalance(app) { let accountowner = app.getArgument(PARAM_ACCOUNT_OWNER); console.log('accessToken: ' + app.getUser().accessToken); var accessToken = app.getUser().accessToken; auth0.getProfile( accessToken ) .then( userInfo => { console.log('getAccountBalance userInfo:' + userInfo) // query firestore based on user var transactions = db.collection('bank').doc(userInfo.email) .db.collection('accounts').doc(accountowner) .collection('transactions'); return transactions.get(); }) .then( snapshot => { var workingbalance = 0 snapshot.forEach(doc => { workingbalance = workingbalance + doc.data().amount; }); app.tell(accountowner + " has a balance of $" + workingbalance) }) .catch( err => { console.error('Error:', err ); app.tell('I was unable to retrieve your balance at this time.') }) }); } 的{​​{3}}操作:

pandas