【Python 教程】使用 Pandas 整理數(shù)據(jù)

Pandas 是 Python 中用于高效處理數(shù)據(jù)的開源庫,它的名字其實(shí)取自 Panel Data(面板數(shù)據(jù)),即多維數(shù)據(jù)的計(jì)量經(jīng)濟(jì)學(xué)。
在 Pandas 庫出現(xiàn)以前,Python 也能用來處理數(shù)據(jù),但其中對(duì)數(shù)據(jù)分析的支持相當(dāng)有限。因此,Pandas 的出現(xiàn)彌補(bǔ)了原生 Python 的不足,促進(jìn)了 Python 語言在裝載、操作、準(zhǔn)備、建模和分析數(shù)據(jù)上的能力。
由于 Pandas 建立于 NumPy 庫之上,如果此前沒有 NumPy 相關(guān)的基礎(chǔ)知識(shí),也歡迎先看看之前寫過的 NumPy 教程文章:
【Python 核心庫】Numpy 實(shí)景教程與練習(xí)
為什么使用 Pandas 處理數(shù)據(jù)?
Pandas 之所以廣泛應(yīng)用于數(shù)據(jù)處理,是因?yàn)樗臄?shù)據(jù)框架(DataFrame)和系列比其他的模塊或框架擁有更具有可視性。Pandas 簡(jiǎn)明清晰的應(yīng)用程序接口(API)也能讓程序員更專注于代碼的核心部分,使代碼和數(shù)據(jù)都更簡(jiǎn)潔。

如何安裝 Pandas?
使用 Pandas 進(jìn)行編程首先需要在 Python 編輯器或 Python IDE 安裝相應(yīng)的模塊。以教程中使用的 Lightly 為例,只需要在代碼中直接寫入 import pandas as pd
,就可以通過 QuickFix 就可以一鍵安裝。由于 Pandas 庫經(jīng)常需要運(yùn)用 Numpy 相關(guān)的函數(shù),引用 Pandas 的同時(shí)也可以一起通過 import numpy as np
引用 Numpy,更加方便。更多關(guān)于第三方模塊的安裝方式,可以查看如何手動(dòng)下載和安裝依賴。

Pandas 跟練項(xiàng)目:
在這篇 Pandas 跟練項(xiàng)目中,我們將制作一個(gè)簡(jiǎn)易的分?jǐn)?shù)統(tǒng)計(jì)與查分程序。完成這個(gè)項(xiàng)目后,你可以學(xué)會(huì)如何:
將數(shù)據(jù)內(nèi)容轉(zhuǎn)換為表格
使用 Pandas 計(jì)算總分
順序、逆序排列數(shù)據(jù)值
通過查找返回指定數(shù)據(jù)
刪除及合并列表
完整學(xué)習(xí)此教程,可參考代碼:https://d1590a0dfb-share.lightly.teamcode.com
將數(shù)據(jù)內(nèi)容轉(zhuǎn)換為表格
如果回看 Numpy 數(shù)組中的數(shù)據(jù)內(nèi)容,我們其實(shí)可能會(huì)覺得這樣的數(shù)據(jù)形式和慣用的行列式表格有所不同,觀感上也沒有那么清晰。
若用 Pandas 處理同一個(gè)或者更復(fù)雜的數(shù)據(jù),那么他的輸出效果便會(huì)更接近我們場(chǎng)景的表格,最終也能通過函數(shù)輸出為 .csv 類型的表格文件,在 excel 等表格處理軟件中打開。
按照以下代碼添加列名和調(diào)整序列號(hào),即可輸出與表格十分相近的格式:

甚至在 pandas 中,只需要通過簡(jiǎn)單的一行代碼即可輸出為 .xlsx
格式的文件,直接在 Excel 中打開:dataframe.to_excel('score.xlsx')
如果運(yùn)行后返回錯(cuò)誤 no module named 'openpyxl',只需在終端通過 pip install openpyxl
安裝相應(yīng)的模塊,重新運(yùn)行即可。完成后的文件會(huì)出現(xiàn)在左側(cè)的文件欄中,下載到本地即可通過 Excel 或其他表格軟件打開。

Excel 中打開的效果:

使用 Pandas 計(jì)算總分
在原始的成績(jī)數(shù)據(jù)中,我們只有語數(shù)英和理綜的成績(jī),而還沒有計(jì)算總分。雖然我們可以在已導(dǎo)出的 CSV 文件中,另外在 Excel 新添一欄計(jì)算總分,但 Python 中同樣可以將這一程序以簡(jiǎn)單的一段代碼完成:
輸出的中文數(shù)據(jù)不對(duì)齊,怎么辦?
由于 Pandas 的初始字符寬度默認(rèn)為英文,DataFrame 列名含有中文時(shí),Pandas 就會(huì)出現(xiàn)列名和內(nèi)容沒有對(duì)齊的情況。我們只要把 Pandas 的兩項(xiàng)默認(rèn)設(shè)置為 True 即可:
根據(jù)學(xué)號(hào)順序排列
在原始的成績(jī)數(shù)據(jù)中,我們可以發(fā)現(xiàn)學(xué)號(hào)其實(shí)是亂序的,這或許不一定符合學(xué)校的格式要求。如果需要將成績(jī)數(shù)據(jù)根據(jù)學(xué)號(hào)進(jìn)行順序排列,同樣也只需要一行代碼即可解決:

【小作業(yè)】嘗試根據(jù) dataframe.sort_values()
,輸出上圖的排序效果。打開 scoreData.py 查看參考答案:https://d1590a0dfb-share.lightly.teamcode.com
返回個(gè)別班級(jí)的所有學(xué)生成績(jī)
為了更方便地查看各班級(jí)的成績(jī),我們其實(shí)還可以通過dataframe.loc[]
函數(shù)查找并返回特定值的內(nèi)容。以 2 班的成績(jī)?yōu)槔覀冎恍枰斎?classResult = dataframe.loc[dataframe['班級(jí)'] == 2]
即可返回僅有 2 班成績(jī)的表格:

【小作業(yè)】嘗試根據(jù)所學(xué)的內(nèi)容,輸出上圖的以總分逆序排列的 2 班成績(jī)。打開 scoreData.py 查看參考答案:https://d1590a0dfb-share.lightly.teamcode.com
刪除和合并列表
假設(shè)英語老師發(fā)現(xiàn)不小心給錯(cuò)了另一個(gè)年級(jí)的分?jǐn)?shù),希望將英語分?jǐn)?shù)刪掉再重新輸入,應(yīng)該怎么辦呢?Pandas 中可以通過 pd.drop()
和 pd.merge()
兩個(gè)函數(shù)刪除和合并數(shù)據(jù)。
首先,使用 pd.drop()
將錯(cuò)誤的行列刪掉:df.drop('英語', inplace=True, axis=1)
【注意】需要把這行代碼放在總分 dataframe.iloc
函數(shù)前,否則總分依舊包含英語成績(jī)。

英語老師隨后給了新的分?jǐn)?shù),因?yàn)榉謹(jǐn)?shù)是根據(jù)學(xué)號(hào)盲改的,所以英語老師也給了含學(xué)號(hào)和學(xué)生成績(jī)的 Excel 文件。上傳后,我們可以通過以下代碼讀取并合并新舊數(shù)據(jù):

擴(kuò)展作業(yè)
嘗試結(jié)合 Python 編程的基本 input()
函數(shù)以及文章中的各個(gè)知識(shí)點(diǎn),制作一個(gè)可以通過學(xué)號(hào)查找學(xué)生各學(xué)科成績(jī)以及總分的簡(jiǎn)易程序。打開 scoreData.py 查看參考答案:https://d1590a0dfb-share.lightly.teamcode.com
恭喜你來到文章的尾聲!在學(xué)習(xí)使用 Python 處理數(shù)據(jù)的時(shí)候,我其實(shí)思考過:明明已經(jīng)有了現(xiàn)成的 Excel 辦公軟件,我們究竟為什么需要學(xué)習(xí) Python 甚至編程?然而,在我學(xué)習(xí) Python 的過程中,我發(fā)現(xiàn):與廣泛使用的第三方軟件相比,我們可以通過編程定制更符合自身需求的程序,同時(shí)去掉不必要的繁瑣內(nèi)容,甚至還不必?fù)?dān)心第三方軟件隨著時(shí)間的流逝,逐漸停運(yùn)或無法滿足我的特定需求。
隨著編程越來越普及化,未來的計(jì)算機(jī)必備技能除了 Office 三件套甚至 PS、視頻剪輯外,相信編程也會(huì)逐漸加入隊(duì)列。對(duì)許多人而言,學(xué)習(xí)編程也許并非易事,但這種技能終究會(huì)像語文、數(shù)學(xué)、英語等過去我們?cè)鴮W(xué)習(xí)的基礎(chǔ)科目一樣,成為我們的知識(shí)基礎(chǔ),幫助我們更好的理解現(xiàn)代科技的運(yùn)作。