小白学 Python 数据分析(7):Pandas 数据分组
引言
各位同學(xué)好呀,我又出來(lái)了,本篇文章我們介紹下 Pandas 的數(shù)據(jù)分組。
本文用的數(shù)據(jù)集再次做更換,有同學(xué)在后臺(tái)問(wèn)小編為什么最近每篇文章都在換數(shù)據(jù)集。
emmmmmmmm,在小白剛?cè)腴T(mén)的時(shí)候,很多同學(xué)找不到數(shù)據(jù)集練手,小編盡量多使用一些數(shù)據(jù)集,傳到代碼倉(cāng)庫(kù)后,大家 Down 下來(lái)直接就能使用,給大家多提供幾個(gè)案例做選擇。
AkShare
本次的數(shù)據(jù)集選擇由 AkShare 提供的本次疫情的歷史數(shù)據(jù)。
AkShare 的簡(jiǎn)介:
AkShare 是基于 Python 的開(kāi)源金融數(shù)據(jù)接口庫(kù), 目的是實(shí)現(xiàn)對(duì)股票, 期貨, 期權(quán), 基金, 外匯, 債券, 指數(shù), 數(shù)字貨幣等金融產(chǎn)品的基本面數(shù)據(jù)、實(shí)時(shí)和歷史行情數(shù)據(jù)、衍生數(shù)據(jù)從數(shù)據(jù)采集, 數(shù)據(jù)清洗, 到數(shù)據(jù)落地的一套開(kāi)源工具, 滿(mǎn)足金融數(shù)據(jù)科學(xué)家, 數(shù)據(jù)科學(xué)愛(ài)好者在金融數(shù)據(jù)獲取方面的需求。
AkShare 的特點(diǎn)是獲取的是相對(duì)權(quán)威的金融數(shù)據(jù)網(wǎng)站公布的原始數(shù)據(jù), 廣大數(shù)據(jù)科學(xué)家可以利用原始數(shù)據(jù)進(jìn)行各數(shù)據(jù)源之間的交叉驗(yàn)證, 進(jìn)而再加工, 從而得出科學(xué)的結(jié)論。
好像和疫情沒(méi)什么關(guān)系么,其實(shí) AkShare 也是在最近的更新中添加了有關(guān)本次疫情的數(shù)據(jù)集。
首先第一件事兒就是先把我們今天要使用到的數(shù)據(jù)集搞下來(lái),首先是 AkShare 的安裝,參考文檔示例進(jìn)行安裝( https://akshare.readthedocs.io/zh_CN/latest/akshare/ak-installation.html ):
-
通用安裝:
pip install akshare --upgrade -
國(guó)內(nèi)安裝-Python:
pip install akshare -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com --upgrade -
國(guó)內(nèi)安裝-Anaconda:
pip install akshare -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com --user --upgrade
除了一些 Python 的庫(kù)需要進(jìn)行安裝,還有一些其他環(huán)境需要安裝,小編這里就不一一列出了,請(qǐng)各位同學(xué)參考文檔進(jìn)行安裝。
安裝好以后,將本次疫情的歷史數(shù)據(jù)進(jìn)行導(dǎo)出成 Excel ,然后開(kāi)始我們今天的正題,這段導(dǎo)出代碼其實(shí)非常簡(jiǎn)單,加上導(dǎo)包總共三行,如下:
import akshare as akepidemic_dxy_df = ak.epidemic_dxy(indicator="global") epidemic_dxy_df.to_excel('epidemic_dxy.xlsx')這里獲取的其實(shí)是本次疫情截止小編寫(xiě)這篇文章時(shí)的一個(gè)最新數(shù)據(jù)。
說(shuō)明: epidemic_dxy_df 是一個(gè) DataFrame ,這里直接通過(guò) DataFrame 的 to_excel 進(jìn)行 Excel 導(dǎo)出。
如果不想使用 Excel 的同學(xué),也可以直接操作 epidemic_dxy_df 這個(gè) DataFrame ,只是每次運(yùn)行的時(shí)候它都要從遠(yuǎn)端拉取數(shù)據(jù),速度上挺慢的,從本地的 Excel 中讀取數(shù)據(jù)還是會(huì)快很多。
導(dǎo)出的 Excel 小編就簡(jiǎn)單截個(gè)圖,如圖:
可以看到,總共有 66 行的數(shù)據(jù),數(shù)據(jù)量不大,我們進(jìn)行操作后,可以人工核實(shí)操作數(shù)據(jù)是否正確。
數(shù)據(jù)分組
如果有對(duì) SQL 使用經(jīng)驗(yàn)的同學(xué)來(lái)講,分組這個(gè)詞并不陌生,在 SQL 中的關(guān)鍵字是 group by ,而在 Pandas 中的方法名也十分相似,是 groupby() 。
當(dāng)然,如果對(duì) SQL 不熟悉的同學(xué)也可以參考下 Excel 的分組,都是一樣的。
我們先按照七大洲對(duì)這個(gè)數(shù)據(jù)做一次分組,看下是什么結(jié)果:
可以看到,這里輸出的了一個(gè) DataFrameGroupBy 的內(nèi)存對(duì)象,實(shí)際上這個(gè)對(duì)象中包含了分組后的一些相關(guān)信息,并沒(méi)有直接顯示出來(lái),我們直接調(diào)用一個(gè)匯總的方法看一下:
print(epidemic_dxy.groupby(['continents']).count())# 輸出內(nèi)容id createTime modifyTime ... operator locationId countryShortCode continents ... 亞洲 26 26 26 ... 26 26 26 其他 1 1 1 ... 1 1 1 北美洲 4 4 4 ... 4 4 4 南美洲 2 2 2 ... 2 2 2 大洋洲 2 2 2 ... 2 2 2 歐洲 27 27 27 ... 27 27 27 非洲 3 3 3 ... 3 3 3count() 的含義是取計(jì)數(shù),就是當(dāng)前的數(shù)據(jù)有多少條,可以看到,亞洲有 26 條數(shù)據(jù)。
如果我想知道當(dāng)前七大洲的匯總數(shù)據(jù)呢?可以用到 sum() 這個(gè)方法:
因?yàn)樵紨?shù)據(jù)有點(diǎn)多,小編這里將所有的列全展示出來(lái),可以看到亞洲目前的確診數(shù)量是 5940 ,當(dāng)然,這里不包含中國(guó)的數(shù)據(jù)。
這里的列太多了,很多列并不是我們關(guān)心的,如果我們只關(guān)心幾個(gè)核心的數(shù)據(jù)怎么展示呢?
我們可以先分組,分組后取出我們需要的列,然后再對(duì)列做運(yùn)算,如下:
import pandas as pd# 數(shù)據(jù)導(dǎo)入 epidemic_dxy = pd.read_excel("epidemic_dxy.xlsx")print(epidemic_dxy.groupby(['continents'])['confirmedCount', 'suspectedCount', 'curedCount', 'deadCount'].sum())# 輸出內(nèi)容confirmedCount suspectedCount curedCount deadCount continents 亞洲 5940 0 399 83 其他 705 0 0 6 北美洲 107 0 7 1 南美洲 8 0 0 0 大洋洲 30 0 15 1 歐洲 2199 0 123 36 非洲 4 0 1 0在進(jìn)行數(shù)據(jù)分組的時(shí)候,我們除了可以使用列名進(jìn)行分組,還可以使用 Series 進(jìn)行分組,它與使用列名進(jìn)行分組在使用上沒(méi)有任何不同:
import pandas as pd# 數(shù)據(jù)導(dǎo)入 epidemic_dxy = pd.read_excel("epidemic_dxy.xlsx")print(epidemic_dxy.groupby(epidemic_dxy['continents'])['confirmedCount', 'suspectedCount', 'curedCount', 'deadCount'].sum())# 輸出內(nèi)容confirmedCount suspectedCount curedCount deadCount continents 亞洲 5940 0 399 83 其他 705 0 0 6 北美洲 107 0 7 1 南美洲 8 0 0 0 大洋洲 30 0 15 1 歐洲 2199 0 123 36 非洲 4 0 1 0這里的 epidemic_dxy[‘continents’] 本身就是一個(gè) Series ,可以看到和上面使用列名進(jìn)行分組無(wú)任何不同。
在分組的時(shí)候,除了可以使用一個(gè)列或者 Series ,還可以使用多個(gè),只需要在 groupby() 的參數(shù)中進(jìn)行添加即可,如下:
我們這里使用了七大洲和國(guó)家進(jìn)行分組,可以看到整個(gè)求和的數(shù)據(jù)集已經(jīng)按照七大洲和國(guó)家求和列出了。
你以為分組到這里就算完了?
nonono,下面還有個(gè)神奇的家伙 —— aggregate() 。
aggregate() 這個(gè)方法是做什么的呢?
如果我們想在一次分組中,進(jìn)行兩次匯總運(yùn)算,那么,就要用到這個(gè)函數(shù)了,比如,我想在剛才的數(shù)據(jù)中先計(jì)數(shù),在求和,那么可以這么寫(xiě):
怎么樣,是不是很神奇,左邊是計(jì)數(shù),右邊是求和。
不過(guò)有一點(diǎn)要注意下,在我們對(duì)數(shù)據(jù)進(jìn)行分組運(yùn)算完成后,有時(shí)候會(huì)需要對(duì)數(shù)據(jù)進(jìn)行進(jìn)一步的處理,由于分組運(yùn)算后的結(jié)果并不是標(biāo)準(zhǔn)的 DataFrame 形式,需要我們對(duì)它進(jìn)行進(jìn)一步的轉(zhuǎn)化,這里用到的方法就是重置索引 reset_index() 。
import pandas as pd# 數(shù)據(jù)導(dǎo)入 epidemic_dxy = pd.read_excel("epidemic_dxy.xlsx")new_dataframe = epidemic_dxy.groupby(epidemic_dxy['continents'])['confirmedCount', 'suspectedCount', 'curedCount', 'deadCount'].sum().reset_index()print(new_dataframe)# 輸出內(nèi)容continents confirmedCount suspectedCount curedCount deadCount 0 亞洲 5940 0 399 83 1 其他 705 0 0 6 2 北美洲 107 0 7 1 3 南美洲 8 0 0 0 4 大洋洲 30 0 15 1 5 歐洲 2199 0 123 36 6 非洲 4 0 1 0這樣,我們就得到了一個(gè)新的 DataFrame ,可以在這個(gè)新的 DataFrame 進(jìn)行新的騷操作了。
本篇的內(nèi)容到這里才算結(jié)束,各位看更的同學(xué),記得要手寫(xiě)代碼哦~~~
總結(jié)
以上是生活随笔為你收集整理的小白学 Python 数据分析(7):Pandas 数据分组的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Fabrice Bellard
- 下一篇: 国内这么多“ChatGPT”是真是假