簡體   English   中英

如何在 pandas 中的分組數據上按列應用用戶定義的 function

[英]how to apply a user defined function column wise on grouped data in pandas

如何將用戶定義的 function 列應用於 pandas 中的分組數據。 用戶定義的 function 返回一系列固定的形狀。

def getStats(col):
names = ['mean', 'std']
return pd.Series([np.mean(col), np.std(col)], index = names, name = col.name)

df = pd.DataFrame({'city':['c1','c2','c1','c2'],
               'age':[10,20,30,40],
               'sal':[1000,2000,3000,4000]})

grp_data = df.groupby('city')
grp_data.apply(getStats)

我已經嘗試過上面的片段。 但我沒有得到預期格式的結果。

城市| 等級| 年齡 | 薩爾

c1 | 意思| x | 是的

c2 | 標准 | x1 | y1

你能幫忙嗎?

我認為這里沒有必要自定義level ,而是通過GroupBy.agg聚合函數列表並通過DataFrame.stack重塑,最后一個DataFrame.rename_axiscity名稱軸和標簽:rename。

df = df.groupby('city').agg([np.mean,np.std]).stack().rename_axis(['city','level'])
print (df)
                  age          sal
city level                        
c1   mean   20.000000  2000.000000
     std    14.142136  1414.213562
c2   mean   30.000000  3000.000000
     std    14.142136  1414.213562

def q(c):
    def f1(x):
        return x.quantile(c)
    f1.__name__ = f'q{c}'
    return f1

df = (df.groupby('city')
        .agg([np.mean,np.std, q(0.25), q(0.75)])
        .stack()
        .rename_axis(['city','level']))

print (df)
                  age          sal
city level                        
c1   mean   20.000000  2000.000000
     std    14.142136  1414.213562
     q0.25  15.000000  1500.000000
     q0.75  25.000000  2500.000000
c2   mean   30.000000  3000.000000
     std    14.142136  1414.213562
     q0.25  25.000000  2500.000000
     q0.75  35.000000  3500.000000

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM