天天看點

dataframe groupby 自定義聚合函數

一、背景

業務需求,需要對資料聚合之後,按照分組對組内的結果按照自己定義的計算方法聚合

二、代碼實作

dataframe groupby 自定義聚合函數

參考代碼如下:

# 讀取源檔案
df1 = pd.read_excel('./test_3.xlsx')
df1.head()

# 自定義聚合函數
def get_total_marks(list1: list):
    """
    自定義聚合函數:計算規則如下
    計算清單的結果: = 最大 + 1/2 * 第二大  + 1/4 * 第三大 + ... + (1/2**(n-1) * 第n大 
    """
    res = 0
    list1.sort(reverse=True)
    for index, i in enumerate(list1):
        res += i * 2**(-index)
    return res

# 使用dataframe聚合

df2 = df1.sort_values(["site", "code", "stock_price"],ascending=[True, True, False])
df3 = df2.drop_duplicates(["code", "site"])
df4 = df3.groupby(["code"]).apply(lambda x: get_total_marks([i for i in x["stock_price"]]))
df5 = df4.reset_index()
df5.columns = ["code", "total_mark"]
df5
           

groupby之後可以使用apply()方法,此方法支援傳入一個函數,普通的sum(), max(), mean()不能滿足我們需求的時候,可以考慮自定義函數來完成聚合。