處理大量數據時,經常需要對數據進行分組和彙總,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
3. groupby 使用示例
下面通過具體的示例演示groupby
常用的使用方法。
3.1. 單列分組再聚合
單列聚合是指針對某一列彙總計算,比如:
針對“股票代碼”聚合,看看不同股票的開盤價和收盤價的平均值。
# 只保留需要的列
data = df.loc[:, ["股票代碼", "開盤", "收盤"]]
# 根據股票代碼聚合平均值
data.groupby(by=["股票代碼"]).mean()
一共5352
支股票,聚合之後,紅色框內的是每支股票開盤價和收盤價的平均值。
3.2. 多列分組再聚合
多列分組聚合時,按照groupby
中by
參數的順序,依次進行分組,然後再聚合。
本次的使用的數據包含2024年1月和2月的數據,
我們先按照“股票代碼”分組,再按“月份”分組,最後彙總信息。
聚合之前,先把日期的格式轉換成月的形式:
data = df.loc[:, ["股票代碼", "日期", "開盤", "收盤"]]
data["日期"] = data["日期"].str.slice(0, 7)
data
根據“股票代碼”和“日期”來聚合每支股票每個月的開盤價和收盤價的最大值:
data.groupby(by=["股票代碼", "日期"]).max()
聚合之後的DataFrame
,有2
個Index
(索引)。
3.3. 一次分組多次聚合
聚合彙總信息時,可以一次彙總多個信息,這樣分組一次就可以了,不用每次聚合都重複調用groupby
去分組。
比如,下面的示例一次彙總出每支股票每個月開盤價和收盤價的最大值,最小值,平均值:
data.groupby(by=["股票代碼", "日期"]).agg(["mean", "max", "min"])
3.4. 定製分組的聚合方式
更進一步,我們還可以針對不同的列採用不同的聚合方式。
比如,對開盤價彙總最大值和平均值,對收盤價彙總最小值和平均值:
data.groupby(by=["股票代碼", "日期"]).agg(
{
"開盤": ["max", "mean"],
"收盤": ["min", "mean"],
}
)
3.5. 聚合後重置索引
從上面聚合後數據的截圖中,可以發現,聚合之後,分組用的列(比如 ["股票代碼", "日期"])變爲索引。
如上所示,聚合之後返回的DataFrame
,紅色框內的是索引(index
),藍色框內的是列(columns
)。
如果,我們希望分組聚合統計之後,分組的列(比如 ["股票代碼", "日期"])仍然作爲DataFrame
的列,
可以在groupby
分組時使用as_index=False
參數。
data.groupby(by=["股票代碼", "日期"], as_index=False).agg(
{
"開盤": ["max", "mean"],
"收盤": ["min", "mean"],
}
)
這樣的話,分組的列(比如 ["股票代碼", "日期"])就不會成爲索引。
4. 總結
總的來說,groupby
函數是 pandas
庫中一個非常常用的工具,它大大簡化了數據處理和分析的過程,
使得用戶能夠更高效地洞察和理解數據。