簡體   English   中英

將加權平均函數應用於pandas groupby對象中的列,但權重總和為零

[英]Applying weighted average function to column in pandas groupby object, but weights sum to zero

我將不同的功能應用於pandas groupby對象中的每一列。 這些函數之一是加權平均值,其中權重是DataFrame另一列中的關聯值。 但是,對於我的許多組,權重之和為零。 因此,我在運行代碼時收到“權重總和為零,無法規范化”錯誤消息。

參考下面的代碼,對於由col1值x和col2值y定義的組,col1 = x和col2 = y的行中col3中的值之和為零,從而在col5的加權平均值中產生誤差。

有什么方法可以使權重總和為零的組返回零的“加權平均值”值? 謝謝!

df = pd.DataFrame([['x','x','x','y','y','y'],['a','a','b','b','c','c'],
                   [0,0,3,4,5,6],[1,1,1,1,1,1],[0,0,4,6,2,8]],
                   ).transpose()
df.columns = ['col1','col2','col3','col4','col5']

weighted_average = lambda x: np.average(x, weights=df.loc[x.index, 'col3'])
averages = df.groupby(['col1','col2']).agg({'col3':'sum', 
                               'col4':'sum', 
                               'col5': weighted_average})

我們可以執行以下操作:

  • 編寫我們自己的函數,以檢查col3col5是否有0 否則采用加權平均值。
  • 合並sum而沒有加權平均值
def weighted_average(x):
    if (x.col3 > 0).all() & (x.col5 > 0).all():
        return np.average(x.col5, weights=x.col3)
    else:
        return 0


averages = df.groupby(['col1','col2']).agg({'col3':'sum', 
                                            'col4':'sum'})

weighted_avg = df.groupby(['col1','col2']).apply(weighted_average)

df_averages = pd.concat([averages, weighted_avg ], axis=1)\
                .reset_index()\
                .rename({0:'col5'}, axis=1)

產生:

print(df_averages)
           col3  col4      col5
col1 col2                      
x    a        0     2  0.000000
     b        3     1  4.000000
y    b        4     1  6.000000
     c       11     2  5.272727

暫無
暫無

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

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