使用pandas和openpyxl處理複雜Excel數據

2021-01-11 蟲蟲搜奇

關於Excel數據處理,很多同學可能使用過Pyhton的pandas模塊,用它可以輕鬆地讀取和轉換Excel數據。但是實際中Excel表格結構可能比較雜亂,數據會分散不同的工作表中,而且在表格中分布很亂,這種情況下啊直接使用pandas就會非常吃力。本文蟲蟲給大家介紹使用pandas和openpyxl讀取這樣的數據的方法。

問題緣起

pandas read_excel函數在讀取Excel工作表方面做得很好。但是,如果數據不是從頭開始,不是從單元格A1開始的連續表格,則結果會不是很好。比如下面一個銷售表,使用read_excel讀取:

讀取的結果如下所示:

結果中標題表頭變成了Unnamed,而且還會額外增加很多職位NaN不存在列,欄位為空的列的值也會被轉換為NaN,這顯然不是我們所期望的。

header和usecols參數

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

import pandas as pd

from pathlib import Path

src_file = 'sales.xlsx'

df = pd.read_excel(src_file, header=1, usecols='B:F')

結果的DataFrame包含了我們期望的數據。

代碼中使用header和usecols參數設定了用於顯示標題的列和需要讀取的欄位:

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

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

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

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

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

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

df = pd.read_excel(

src_file,

header=1,

usecols=['item_type', 'order id', 'order date', 'state', 'priority'])

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

usecols支持一個回調函數column_check,可通過該函數對數據進行處理。

下面是一個簡單的示例:

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表達式。下面的示例中定義的需要顯示的欄位列表。為了進行比較,通過將名稱轉換為小寫來規範化。

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)

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

關於read_exce函數更多參數可以查看官方文檔,下面是一個總結表格:

結合openpyxl

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

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'])

該鍵對應於Excel中分配給表的名稱。這樣就可以設定要讀取的Excel範圍:

lookup_table = sheet.tables['ship_cost']

lookup_table.ref

'C8:E16'

這樣就獲得了要加載的數據範圍。最後將其轉換為pandas DataFrame即可。遍歷每一行並轉換為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])

結果數據框:

總結

在理想情況下,使用的數據將採用簡單一致的格式。在本文中,我們介紹了在Pandas下通過參數輕鬆刪除行和列以使其格式更加合理。尤其是結合openpyxl的情況下可以讓我們讀取Excel數據更加靈活,可以處理比較複雜的表格數據。

相關焦點

  • Python利用openpyxl處理excel文件(openpyxl的安裝及簡介)
    作為一名苦逼的文員,經常同word、excel、ppt打交道,有些工作,比如事務性的,敲幾個文字,做幾個圖表,一般人都應該沒有啥問題,很輕鬆就會搞定。但是在同excel打交道過程中,你會面對一系列公式、紛繁的統計和複雜數據分析,比如這個公式:=IFERROR(TRIM(IF(LEN(VLOOKUP(F7,Sheet3!
  • 懂Excel就能輕鬆入門Python數據分析包pandas(十六):合併數據
    此系列文章收錄在公眾號中:數據大宇宙 > 數據處理 >E-pd經常聽別人說 Python 在數據領域有多厲害,結果學了很長時間,連數據處理都麻煩得要死。後來才發現,原來不是 Python 數據處理厲害,而是他有數據分析神器—— pandas前言本系列上一節說了拆分數據的案例,這次自然是說下怎麼合併數據。
  • Python數據分析:pandas讀取和寫入數據
    我的公眾號是關於自己在數據分析/挖掘學習過程中的一些技術和總結分享,文章會持續更新......繼續深入學習pandas相關操作,數據讀取寫入、分組、合併,轉換等等。前面一篇文章裡已經寫了關於描述性統計以及常用的基本操作。接下來的一段時間裡,我將陸續地去掌握並輸出。這篇文章是關於數據讀取與寫入的知識點。
  • 用Pandas演示tips的小技巧,學到了嗎?
    還可以在pandas分析伺服器上製作API,這樣就可以在網頁瀏覽器的數據幀中追蹤最新數值。注意,這需要用到lxml軟體包,可以用pip安裝lxml。df_html =df.to_html()with open('analysis.html', 'w') as f:f.write(df_html)read_html函數甚至可以將HTML解析為pandas數據幀。筆者還沒有使用過通用HTML進行嘗試,但無疑會很有用。
  • 從Excel中解救你!如何用Python實現報表自動化
    通過使用筆者在數據透視表教程中的數據(https://towardsdatascience.com/a-step-by-step-guide-to-pandas-pivot-tables-e0641d0c6c70),概覽一下我們將要自動化到底是什麼。數據格式將使你期望從公司資料庫中獲得的內容與客戶銷售數據相匹配,與你期望從公司資料庫中獲得的數據相匹配。
  • pandas指南:做更高效的數據科學家
    我通常不使用其他函數,比如to_excel,to_json,to_pickle,to_csv,雖然它們也做得很好,但是csv是保存表最常用的方法。3、檢查數據:.head(3)列印數據的前3行,.tail()函數將查看數據的最後一行。列印第8行。將第8行值列印在「column_1」上。列印第4行到第6行。
  • pandas數據處理:常用卻不甚了解的函數,pd.read_excel()
    人們經常用pandas處理表格型數據,時常需要讀入excel表格數據,很多人一般都是直接這麼用:pd.read_excel(「文件路徑文件名」),再多一點的設置可能是轉義一下路徑中的斜槓,一旦原始的excel表不是很規整,這樣簡單讀入勢必報錯!
  • Python數據分析利器,Pandas入門介紹,幫你便捷高效處理複雜數據
    關於Python的數據分析,當我們遇到的數據量小、數據結構簡單時,可以通過字典、列表等Python常見的數據結構來處理。但是當我們面對的大量數據以及複雜數據的局面時,就需要用一些專門用於數據分析的擴展庫來處理數據了。今天給大家介紹一個Python裡專門用來做數據分析和處理的擴展庫。
  • Python利用openpyxl處理Excel文件(單元格及行列具體操作)
    通過實戰項目演示,進一步加深了印象,整個過程我們不難發現,對於使用openpyxl操作Excel文件,行列遍歷及單元格的定位操作是整個過程的重要技巧和先決條件,因此,這節我們著重講解openpyxl對於單元格及行列遍歷的具體操作。
  • 懂Excel輕鬆入門Python數據分析包pandas(二十七):IF函數代替者
    此系列文章收錄在:數據大宇宙 > 數據處理 > E-pd轉發本文並私信我"python",即可獲得Python資料以及更多系列文章(持續更新的)經常聽別人說 Python 在數據領域有多厲害,結果學了很長時間,連數據處理都麻煩得要死。
  • 想成為高效數據科學家?不會Pandas怎麼行
    這點很棒,因為你只需要使用 pandas 就可以完成工作。pandas 相當於 python 中 excel:它使用表(也就是 dataframe),能在數據上做各種變換,但還有其他很多功能。如果你早已熟知 python 的使用,可以直接跳到第三段。
  • 未明學院:7張思維導圖掌握數據分析關鍵庫pandas
    原創: 未明學院Pandas是一個強大的分析結構化數據的工具集;它基於numpy,用於數據分析和數據挖掘,同時也提供數據清洗功能。pandas與numpy一起構成了數據分析的基礎雙生庫。今天小明邀請了未明的王老師,給大家總結了pandas的核心知識,主要包括以下幾個方面。pandas核心知識01、首先我們來認識一下pandas的一些基本概念。pandas概述02在使用pandas做數據分析的時候往往第一步就是將數據導入進來,比如csv或者excel格式的數據,下面這張圖就是我們讀取數據時候的方法和參數。
  • PANDAS: 新手教程 一
    Pandas是一個強大的開源數據分析和操作庫。它可以幫助你對數據進行各種操作,並生成有關它的不同報告。我將把這篇文章分成兩篇基本知識-我將在這個故事中介紹。我將介紹Pandas的基本功能,這些功能將使你大致了解如何開始使用Pandas,以及它如何幫助你節省大量時間。高級-將通過高級的功能,使它更容易解決複雜的分析問題。
  • 快速介紹Python數據分析庫pandas的基礎知識和代碼示例
    為了能夠快速查找和使用功能,使我們在進行機器學習模型時能夠達到一定流程化。我創建了這個pandas函數的備忘單。這不是一個全面的列表,但包含了我在構建機器學習模型中最常用的函數。讓我們開始吧!本附註的結構:導入數據導出數據創建測試對象查看/檢查數據選擇查詢數據清理篩選、排序和分組統計數據首先,我們需要導入pandas開始:import pandas as pd導入數據使用函數pd.read_csv直接將CSV轉換為數據格式。注意:還有另一個類似的函數pd。read_excel用於excel文件。
  • 懂Excel就能輕鬆入門Python數據分析包pandas(七):分列
    經常聽別人說 Python 在數據領域有多厲害,結果學了很長時間,連數據處理都麻煩得要死。後來才發現,原來不是 Python 數據處理厲害,而是他有數據分析神器—— pandas前言今天從兩個需求來看看數據分列功能,由於 Excel 自帶功能比較弱,在處理稍微複雜的需求時會顯得力不從心,因此,本系列文章將引入 Excel 中一個非常高效的數據處理插件—— Power Query,並且看看 pandas 是怎樣靈活解決。
  • PANDAS: 新手教程 一 - 人工智慧遇見磐創
    Pandas是一個強大的開源數據分析和操作庫。它可以幫助你對數據進行各種操作,並生成有關它的不同報告。我將把這篇文章分成兩篇基本知識-我將在這個故事中介紹。我將介紹Pandas的基本功能,這些功能將使你大致了解如何開始使用Pandas,以及它如何幫助你節省大量時間。高級-將通過高級的功能,使它更容易解決複雜的分析問題。
  • 懂Excel也能輕鬆入門Python數據分析包pandas(二):高級篩選(上)
    更多 Python 數據處理的乾貨,敬請關注!!!!系列文章:懂Excel就能輕鬆入門Python數據分析包pandas(一):篩選功能前言經常聽別人說 Python 在數據領域有多厲害,結果學了很長時間,連數據處理都麻煩得要死。
  • python數據分析——pandas導出數據合集
    導入pandas庫:import pandas as pd導入基礎數據:df=pd.read_excel('數據.xlsx')1.將DataFrame寫入csv\txt文件DataFrame.to_csv()常用參數:path_or_buf=None:輸出文件路徑,默認None
  • 6個提升效率的pandas小技巧
    pandas是python中常用的數據分析庫,出現頻率非常高,而且pandas功能之多讓人咋舌,即使pandas老手也沒法保證能高效使用pandas做數據分析。這篇文章目的梳理幾個高效實用的pandas小技巧,供大家參考。1.
  • python數據分析——pandas導入數據合集
    導入pandas庫import pandas as pd1.導入csv\txt文件數據pd.read_csv()常用參數:filepath_or_buffer:文件路徑(必填,其他參數按需求填寫)sep:指定分隔符,默認逗號','。header:指定第幾行作為表頭。