python 处理xml pandas_Python数据处理分析,解决pandas中所有的Excel疑难杂症(上)
發(fā)現(xiàn)許多小伙伴入門Python幾個月,還是低效率做數(shù)據(jù)處理。這套課程以形象的示意圖,精心安排的案例,循序漸進(jìn)帶你玩轉(zhuǎn)數(shù)據(jù)處理分析神器——pandas,課程中還有分析案例噢,干貨滿滿!
前言
經(jīng)過前2個階段,22節(jié)課的學(xué)習(xí),相信大家已經(jīng)能夠應(yīng)用 pandas 解決一些實際問題。
不過,前2個階段算是入門內(nèi)容,主要讓你了解 pandas 的整體概念及其常用方法。
你會發(fā)現(xiàn)這些方法中有許多參數(shù),看著就一頭霧水,接下來第3階段我們將深入每個應(yīng)用場景,詳細(xì)講解這些方法的使用,首先講解的是數(shù)據(jù)加載相關(guān)知識。
多種數(shù)據(jù)來源
有小伙伴會問:這課程的數(shù)據(jù)不是 csv 文件就是 excel 文件了,pandas 還可以從其他類型的文件獲取數(shù)據(jù)嗎
實際上,pandas 支持的數(shù)據(jù)源非常多,有一些你可能都沒想到,先看看他的數(shù)據(jù)源支持列表:
可以看到有3種大類(文本、二進(jìn)制、SQL)
其中有許多我們很少聽說的格式(Feather Format、Parquet Format)
不僅是 csv ,網(wǎng)頁數(shù)據(jù)和 json 文件都可以直接加載,就連本地的剪切板都能支持
此外,由于 pandas 可以通過 python 內(nèi)置數(shù)據(jù)結(jié)構(gòu)(字典、列表等)來構(gòu)造 DataFrame,因此即使是上述列表沒有支持的格式(比如 xml),我們也同樣可以結(jié)合其他第三方庫輕松實現(xiàn)
本專欄會詳細(xì)講解的數(shù)據(jù)源如下:
excel
csv
Feather Format
SQL
本文先講解 excel 相關(guān)的。
小伙伴:'這么簡單的內(nèi)容也需要講解?不就是一個 read_excel 就搞定的事情嗎'
其實這加載方式的方法都有許多參數(shù),同時也有一些坑,我們開始吧
案例1:加載數(shù)據(jù)
小伙伴:加載數(shù)據(jù)這么簡單也好意思說?
'看下去你就知道里面存在很多小技巧'
從一個 Excel 文件加載一個工作表到 DataFrame 是非常容易:
pd.read_excel('data/data_sp4.xlsx','1')
第一參數(shù)是文件的所在路徑(絕對路徑或相對路徑)
第二參數(shù)是 Excel 文件中的工作表名字,注意,名字總是字符串
關(guān)于相對路徑等知識,請查看我的'Python入門必備系列'文章 建議大家使用此方法的前2個參數(shù)時,不要把參數(shù)名字寫出來,因為在舊版本的 pandas 中,第二參數(shù)的名字有所不同,有時候會出現(xiàn)難以查錯的情況
小伙伴:那么如果需要加載一個 Excel 的2個工作表,是不是就要寫2次pd.read_excel ?
pandas 當(dāng)然不會這么折磨人,直接看看代碼:
當(dāng)?shù)诙?shù)傳入字符串列表時,他會同時加載指定的工作表
結(jié)果是一個有順序的字典
為什么要強調(diào) 字符串列表 ?因為你也可以通過位置來指定工作表,比如:[0,1] 表示加載第一個和第二個工作表。位置總是用 數(shù)值列表 表示
那怎么訪問每個工作表的數(shù)據(jù)呢:
df['1'],你就當(dāng)作是普通的字典即可,通過工作表名字即可獲得對應(yīng)的數(shù)據(jù) DataFrame
小伙伴:好吧,這樣也算方便,但是我現(xiàn)在需要整個文件所有的工作表,但我不知道他們的名字呀。
pandas 當(dāng)然也考慮到這點:
當(dāng)?shù)诙?shù)設(shè)置為 None 時,他會加載所有的工作表
案例2:表頭不在首行
Excel 的數(shù)據(jù)格式經(jīng)常會讓你有驚喜,比如有一次同事給你一個如下的數(shù)據(jù)表:
表格的前2行是一個大標(biāo)題,對我們來說是沒有用的數(shù)據(jù)。
有效的標(biāo)題行在第3行
前2列是空列
面對這樣的數(shù)據(jù),如果只是簡單調(diào)用 pd.read_excel() ,只能得到如下的效果:
默認(rèn)情況下,pandas 會把首行作為 DataFrame 的表頭(columns),這是 header 參數(shù)的作用,其值默認(rèn)為0,表示第1行(0表示第一行,1表示第二行,以此類推)
所有的列都被加載
我們可以通過簡單設(shè)置 header 參數(shù),讓其把第3行作為表頭:
設(shè)置 header = 2,表示使用第3行作為表頭,pandas 會自動跳過前2行
案例3:只加載部分列的數(shù)據(jù)
但是,上一個例子中的前2列仍然是沒用的空列,我們可以通過參數(shù) usecols 完成任務(wù):
設(shè)置 usecols=['日期', '銷量'],讓其只保留 日期 與 銷量 2列
有人抬杠說到:有時候我也不知道具體列的表頭名字,反正我就是要加載第3和第4列。如下:
注意此時的表頭不是叫 '日期' 與 '銷量'
我們同樣可以通過 usecols 完成:
usecols=[2, 3],當(dāng)這參數(shù)設(shè)置為數(shù)值列表時,他就知道你要的是指定位置的列
當(dāng) usecols 指定為字符串列表時,他會認(rèn)為你要指定列名字(名字都是字符串呀)
此外,我們還可以通過 Excel 的列號指定:
usecols='C,D' ,當(dāng)參數(shù)設(shè)置為單個字符串時,就認(rèn)為是 Excel 的列號,這表示讀取 C 和 D 列
如果你熟悉 Excel 的公式,此方式還可以設(shè)置區(qū)間,比如 'A,C:E',表示讀取 A,C至E 列,總共4列數(shù)據(jù)
有一次小伙伴真遇到大難題了,他發(fā)現(xiàn)拿到的 Excel 數(shù)據(jù)的有效列的位置不是固定的,如下:
有可能需要的數(shù)據(jù)是在不同的列上
那么有沒有一種方法可以不管列在哪里,都只加載有效的列呢?
既然這里有提出來,自然就有辦法解決,先看看如果不指定參數(shù) usecols 的情況:
前4列的第3行由于是空值,因此 pandas 會默認(rèn)使用 Unnamed:序號 作為這些表頭的名字
那么我們可以通過這個邏輯去把這些列去掉:
usecols=lambda n: n.find('Unnamed') < 0,當(dāng) usecols 是一個可執(zhí)行的對象時(任何的方法或 lambda),那么 pandas 就會把列名字逐一輸入到這個方法中,當(dāng)方法執(zhí)行結(jié)果為 True,則保留此列
n.find('Unnamed') ,n 就是列名字,是一個字符串,調(diào)用其 find 方法查找字符串 Unnamed ,如果找不到,則此方法返回 -1
因此,整個 usecols 設(shè)置的語義是:名字中找不到 Unnamed 的列 ,給我保留下來吧
看看如下示意圖:
總結(jié)
本節(jié)重點掌握以下知識:
pd.read_excel ,前2個參數(shù)分別是 Excel 文件路徑、數(shù)據(jù)所在工作表名字
header 參數(shù)指定表頭位置
usecols 指定加載的列名字(也可以是位置或自定義邏輯)
pd.read_excel 方法實際有多達(dá)10+個參數(shù),但實際上常用的參數(shù)不多,以后我找到他們的實戰(zhàn)應(yīng)用案例再分享。
下一節(jié)講解輸出 Excel 的知識,看看怎么解決 to_excel 方法覆蓋原文件內(nèi)容的問題
總結(jié)
以上是生活随笔為你收集整理的python 处理xml pandas_Python数据处理分析,解决pandas中所有的Excel疑难杂症(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重生1990卖小龙虾起家的小龙虾是什么梗
- 下一篇: python newspaper_第74