Python如何利用Pandas處理復(fù)雜的Excel數(shù)據(jù)

本篇內(nèi)容主要講解“Python如何利用Pandas處理復(fù)雜的Excel數(shù)據(jù)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Python如何利用Pandas處理復(fù)雜的Excel數(shù)據(jù)”吧!

創(chuàng)新互聯(lián)IDC提供業(yè)務(wù):成都多線機(jī)房,成都服務(wù)器租用,成都多線機(jī)房,重慶服務(wù)器租用等四川省內(nèi)主機(jī)托管與主機(jī)租用業(yè)務(wù);數(shù)據(jù)中心含:雙線機(jī)房,BGP機(jī)房,電信機(jī)房,移動機(jī)房,聯(lián)通機(jī)房。

問題緣起

pandas  read_excel函數(shù)在讀取Excel工作表方面做得很好。但是,如果數(shù)據(jù)不是從頭開始,不是從單元格A1開始的連續(xù)表格,則結(jié)果會不是很好。比如下面一個銷售表,使用read_excel讀?。?/p>

Python如何利用Pandas處理復(fù)雜的Excel數(shù)據(jù)

讀取的結(jié)果如下所示:

Python如何利用Pandas處理復(fù)雜的Excel數(shù)據(jù)

結(jié)果中標(biāo)題表頭變成了Unnamed,而且還會額外增加很多職位NaN列,字段為空的列的值也會被轉(zhuǎn)換為NaN,這顯然不是我們所期望的。

header和usecols參數(shù)

對這樣的非標(biāo)準(zhǔn)格式的表格,我們可以使用read_excel()的header和usecols參數(shù)來控制選擇的需要讀取的列。

import pandas as pd from pathlib import Path src_file = 'sales.xlsx'

Python如何利用Pandas處理復(fù)雜的Excel數(shù)據(jù)

結(jié)果的DataFrame包含了我們期望的數(shù)據(jù)。

代碼中使用header和usecols參數(shù)設(shè)定了用于顯示標(biāo)題的列和需要讀取的字段:

  • header參數(shù)為一個整數(shù),從0開始索引,其為選擇的行,比如1表示Excel中的第2行。

  • usecols參數(shù)設(shè)定選擇的Excel列范圍范圍(A-…),例如,B:F表示讀取B到F列。

在某些情況下,可能希望將列定義為數(shù)字列表。比如,可以定義整數(shù)列數(shù):

df = pd.read_excel(src_file, header=1, usecols=[1,2,3,4,5])

這對對大型數(shù)據(jù)集(例如,每3列或僅偶數(shù)列)要遵循一定的數(shù)字模式,則這個參數(shù)方法會很有用。

usecols還可以設(shè)定從列名列表讀取。比如上面的例子也可以這樣寫:

df = pd.read_excel( src_file, header=1, usecols=['item_type', 'order id', 'order date', 'state', 'priority'])

列順序支持自由選擇,這種命名列列表的方式實際中很有用。

usecols支持一個回調(diào)函數(shù)column_check,可通過該函數(shù)對數(shù)據(jù)進(jìn)行處理。

下面是一個簡單的示例:

def column_check(x):      if 'unnamed' in x.lower():            return False      if 'priority' in x.lower():           return False      if 'order' in x.lower():           return True     return True
df = pd.read_excel(src_file, header=1, usecols=column_check)

column_check按名稱解析每列,每列通過定義True或False,來選擇是否讀取。

usecols也可以使用lambda表達(dá)式。下面的示例中定義的需要顯示的字段列表。為了進(jìn)行比較,通過將名稱轉(zhuǎn)換為小寫來規(guī)范化。

cols_to_use = ['item_type', 'order id', 'order date', 'state', 'priority'] df = pd.read_excel(src_file, header=1, usecols=lambda x: x.lower() in cols_to_use)

回調(diào)函數(shù)為我們提供了許多靈活性,可以處理Excel文件的實際混亂情況。

關(guān)于read_exce函數(shù)更多參數(shù)可以查看官方文檔,下面是一個總結(jié)表格:

Python如何利用Pandas處理復(fù)雜的Excel數(shù)據(jù)

結(jié)合openpyxl

在某些情況下,數(shù)據(jù)甚至可能在Excel中變得更加復(fù)雜。在下面示例中,我們有一個ship_cost要讀取的表。如果必須使用這樣的文件,那么只用pandas函數(shù)和選項也很難做到。在這種情況下,可以直接使用openpyxl解析文件并將數(shù)據(jù)轉(zhuǎn)換為pandas  DataFrame。比如要讀取下面示例的數(shù)據(jù):

Python如何利用Pandas處理復(fù)雜的Excel數(shù)據(jù)

from openpyxl import load_workbook import pandas as pd from pathlib import Path src_file = ' sales1.xlsx'

加載整個工作簿:

cc = load_workbook(filename = src_file)

查看所有工作表:

cc.sheetnames

['sales', 'shipping_rates']

要訪問特定的工作表:

sheet = cc['shipping_rates']

要查看所有命名表的列表:

sheet.tables.keys()

dict_keys(['ship_cost'])

該鍵對應(yīng)于Excel中分配給表的名稱。這樣就可以設(shè)定要讀取的Excel范圍:

lookup_table = sheet.tables['ship_cost']
lookup_table.ref

'C8:E16'

這樣就獲得了要加載的數(shù)據(jù)范圍。最后將其轉(zhuǎn)換為pandas DataFrame即可。遍歷每一行并轉(zhuǎn)換為DataFrame:

data = sheet[lookup_table.ref] rows_list = []  for row in data: cols = [] for col in row: cols.append(col.value) rows_list.append(cols)  df = pd.DataFrame(data=rows_list[1:], index=None, columns=rows_list[0])

結(jié)果數(shù)據(jù)框:

Python如何利用Pandas處理復(fù)雜的Excel數(shù)據(jù)

到此,相信大家對“Python如何利用Pandas處理復(fù)雜的Excel數(shù)據(jù)”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

文章題目:Python如何利用Pandas處理復(fù)雜的Excel數(shù)據(jù)
當(dāng)前鏈接:http://muchs.cn/article12/ihihdc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、建站公司、Google、網(wǎng)站設(shè)計公司用戶體驗、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)