pandas速成筆記(3)-join/groupby操作
阿新 • • 發佈:2022-03-19
接上篇繼續 ,這回看下一些常用的操作:
一、join 聯表查詢
有資料庫開發經驗的同學,一定對sql中的join ... on 聯表查詢不陌生,pandas也有類似操作
假設test.xlsx的sheet1, sheet2中分別有下面的資料(相當於2張表)
現在要以ID做為作為Key,將二張表join起來,可以這樣寫:
import pandas as pd pd1 = pd.read_excel("./data/test.xlsx", sheet_name="sheet1", index_col="ID") pd2 = pd.read_excel("./data/test.xlsx", sheet_name="sheet2", index_col="ID") print("-----pd1--------") print(pd1) print("\n-----pd2--------") print(pd2) print("\n------default-------") pd3 = pd1.join(pd2) print(pd3) print("\n------left-------") pd3 = pd1.join(pd2, how="left") print(pd3) print("\n------right-------") pd3 = pd1.join(pd2, how="right") print(pd3) print("\n------inner-------") pd3 = pd1.join(pd2, how="inner") print(pd3) print("\n------outer-------") pd3 = pd1.join(pd2, how="outer") print(pd3)
輸出:
-----pd1-------- Name ID 10 A 11 B 12 C -----pd2-------- Score ID 11 90 12 80 13 76 ------default------- Name Score ID 10 A NaN 11 B 90.0 12 C 80.0 ------left------- Name Score ID 10 A NaN 11 B 90.0 12 C 80.0 ------right------- Name Score ID 11 B 90 12 C 80 13 NaN 76 ------inner------- Name Score ID 11 B 90 12 C 80 ------outer------- Name Score ID 10 A NaN 11 B 90.0 12 C 80.0 13 NaN 76.0
是不是跟sql幾乎一模一樣?如果2個表格中的Key,名稱不一樣,比如第2個表格長這樣,第1列不叫ID,而是stutent_id
也不影響,只要在讀取時設定了索引即可,預設join時就是用index列做為key關聯
二、groupby分組統計
假設有一張表:
想按月彙總下Amount的總和,直接使用groupby("Month")
import pandas as pd df = pd.read_excel("./data/test.xlsx") print(df) print("------------") df_month = df.groupby("Month").sum() print(df_month)
輸出:
Category Amount Month 0 A 10 2021-09 1 B 20 2021-09 2 C 30 2021-09 3 A 15 2021-10 4 B 25 2021-10 5 C 35 2021-10 ------------ Amount Month 2021-09 60 2021-10 75
來個更復雜的,希望按Category看看,在本月當中該Category的Amount佔"當月Amount總和"的佔比,比如2021-09月,Amount總和為60,而9月之中,C類的Amount=30,即9月C類的Amount佔9月總Amount的50%
import pandas as pd df = pd.read_excel("./data/test.xlsx") print(df) print("------------") df_month = df.groupby("Month").sum() print(df_month) print("------------") # 插入2列 df.insert(2, 'MonthTotal', 0) df.insert(3, 'MonthPercent', 0.0) # 計算每個月,各Category的Amount佔比 for idx2, data2 in df_month.iterrows(): for idx, data in df.iterrows(): if idx2 == data["Month"]: data["MonthTotal"] = data2["Amount"] data["MonthPercent"] = data["Amount"] / data2["Amount"] df.iloc[idx] = pd.Series(data) df["MonthPercent"] = df["MonthPercent"].apply(lambda x: format(x, '.2%')) print(df)
輸出:
Category Amount Month 0 A 10 2021-09 1 B 20 2021-09 2 C 30 2021-09 3 A 15 2021-10 4 B 25 2021-10 5 C 35 2021-10 ------------ Amount Month 2021-09 60 2021-10 75 ------------ Category Amount MonthTotal MonthPercent Month 0 A 10 60 16.67% 2021-09 1 B 20 60 33.33% 2021-09 2 C 30 60 50.00% 2021-09 3 A 15 75 20.00% 2021-10 4 B 25 75 33.33% 2021-10 5 C 35 75 46.67% 2021-10
除了分組求和,當然還能求平均值,以及分組計算count
import pandas as pd df = pd.read_excel("./data/test.xlsx") print(df) print("------------") category_amount_avg = df.groupby("Category").mean() print(category_amount_avg) print("------------") category_count = df.groupby("Month").count() print(category_count)
輸出:
Category Amount Month 0 A 10 2021-09 1 B 20 2021-09 2 C 30 2021-09 3 A 15 2021-10 4 B 25 2021-10 5 C 35 2021-10 ------------ Amount Category A 12.5 B 22.5 C 32.5 ------------ Category Amount Month 2021-09 3 3 2021-10 3 3
參考:
1、官網 pandas.DataFrame.join 文件
2、官網 pandas.DataFrame.groupby 文件