1. 程式人生 > >python 轉Excel二維表為一維表

python 轉Excel二維表為一維表

今天研究一下使用python怎麼把excel二維錶轉化為一維表。檔名為二維表.xlsx的Sheet1資料來源:

二維表.xlsx的Sheet2要實現的結果:

import pandas as pd
df=pd.read_excel('二維表.xlsx',sheet_name='Sheet1')

得到資料來源的資料幀:

我們再將第一列設定為索引,去掉預設的數字索引:

df1=df.set_index('品名/數量',drop=True)

 結果變成了:

我們再使用DataFrame的stack函式。我們來看一下資料幀stack函式的意思。

意思是將列標題轉化為指定水平索引。也就是將橫著的列轉化為豎著的索引了。使用stack的結果返回的是一個含有多重索引Series.我們試一下例子。程式碼:

df2=df1.stack()

返回的df2:

已經快接近目標了。df2是一個雙重索引的Series.

我們要將這個回到最後的結果,需要在第一層索引加個預設的數值索引即可。有了第一層的索引約束,品名就能完全顯示出來了。

程式碼:df3=df2.reset_index(),就實現了我們要的結果了。

調整一下標題,達到目的:

最後的寫入Excel的完整程式碼,存資料到已經有資料的excel表裡注意使用ExcelWriter的寫法。不然已經存在的表格都會丟失。我已經翻過車了。寫法如下: 

# -*- coding: utf-8 -*-
"""
Created on Tue Nov 20 13:40:42 2018

@author: FanXiaoLei
"""
import pandas as pd
from openpyxl import load_workbook
df=pd.read_excel('二維表.xlsx',sheet_name='Sheet1')
df1=df.set_index('品名/數量',drop=True)
df2=df1.stack()
df3=df2.reset_index()
df3.columns=['品名','尺寸','數量']
wb=load_workbook('二維表.xlsx')
writer=pd.ExcelWriter('二維表.xlsx',engine='openpyxl')
writer.book=wb
writer.sheets=dict((ws.title,ws) for ws in wb.worksheets)
df3.to_excel(writer,sheet_name='Sheet2',index=False)
writer.save()

結果實現: