分組聚合不再難:Pandas groupby使用指南

處理大量數據時,經常需要對數據進行分組和彙總,groupby爲我們提供了一種簡潔、高效的方式來實現這些操作,從而簡化了數據分析的流程。

1. 分組聚合是什麼

分組是指根據一個或多個列的值將數據分成多個組,每個組包含具有相同鍵值(這裏的鍵值即用來分組的列值)的數據行。

聚合或者彙總則是指,在分組後,可以對每個組應用聚合函數(如求和、平均值、計數等),從而得到每個組的彙總信息。

2. 準備數據

下面的示例中使用的數據採集自A股2024年1月和2月的真實交易數據。
數據下載地址:https://databook.top/

導入數據:

import pandas as pd

fp = r'D:\data\2024\歷史行情數據-不復權-2024.csv'

df = pd.read_csv(fp)
df = df.loc[:, ["股票代碼", "日期", "開盤", "收盤", "最高", "最低", "成交量"]]
df

image.png

3. groupby 使用示例

下面通過具體的示例演示groupby常用的使用方法。

3.1. 單列分組再聚合

單列聚合是指針對某一列彙總計算,比如:
針對“股票代碼”聚合,看看不同股票的開盤價收盤價的平均值。

# 只保留需要的列
data = df.loc[:, ["股票代碼", "開盤", "收盤"]]

# 根據股票代碼聚合平均值
data.groupby(by=["股票代碼"]).mean()

image.png
一共5352支股票,聚合之後,紅色框內的是每支股票開盤價收盤價的平均值。

3.2. 多列分組再聚合

多列分組聚合時,按照groupbyby參數的順序,依次進行分組,然後再聚合。
本次的使用的數據包含2024年1月和2月的數據,
我們先按照“股票代碼”分組,再按“月份”分組,最後彙總信息。

聚合之前,先把日期的格式轉換成月的形式:

data = df.loc[:, ["股票代碼", "日期", "開盤", "收盤"]]
data["日期"] = data["日期"].str.slice(0, 7)
data

image.png

根據“股票代碼”“日期”來聚合每支股票每個月的開盤價收盤價的最大值:

data.groupby(by=["股票代碼", "日期"]).max()

image.png
聚合之後的DataFrame,有2Index(索引)。

3.3. 一次分組多次聚合

聚合彙總信息時,可以一次彙總多個信息,這樣分組一次就可以了,不用每次聚合都重複調用groupby去分組。
比如,下面的示例一次彙總出每支股票每個月開盤價收盤價最大值最小值平均值

data.groupby(by=["股票代碼", "日期"]).agg(["mean", "max", "min"])

image.png

3.4. 定製分組的聚合方式

更進一步,我們還可以針對不同的列採用不同的聚合方式。
比如,對開盤價彙總最大值平均值,對收盤價彙總最小值平均值

data.groupby(by=["股票代碼", "日期"]).agg(
    {
        "開盤": ["max", "mean"],
        "收盤": ["min", "mean"],
    }
)

image.png

3.5. 聚合後重置索引

從上面聚合後數據的截圖中,可以發現,聚合之後,分組用的列(比如 ["股票代碼", "日期"])變爲索引。
image.png
如上所示,聚合之後返回的DataFrame,紅色框內的是索引(index),藍色框內的是列(columns)。

如果,我們希望分組聚合統計之後,分組的列(比如 ["股票代碼", "日期"])仍然作爲DataFrame的列,
可以在groupby分組時使用as_index=False參數。

data.groupby(by=["股票代碼", "日期"], as_index=False).agg(
    {
        "開盤": ["max", "mean"],
        "收盤": ["min", "mean"],
    }
)

image.png
這樣的話,分組的列(比如 ["股票代碼", "日期"])就不會成爲索引。

4. 總結

總的來說,groupby 函數是 pandas 庫中一個非常常用的工具,它大大簡化了數據處理和分析的過程,
使得用戶能夠更高效地洞察和理解數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章