1. 程式人生 > 其它 >pandas速成筆記(3)-join/groupby操作

pandas速成筆記(3)-join/groupby操作

上篇繼續 ,這回看下一些常用的操作:

一、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 文件