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