gpt4 book ai didi

python - Pandas 数据框中多列的加权平均值

转载 作者:行者123 更新时间:2023-11-30 22:37:12 25 4
gpt4 key购买 nike

我有一个如下所示的数据框

Class|  Student|    V1| V2| V3| wb

A| Max| 10| 12| 14| 1

A| Ann| 9| 6| 7| 0.9

B| Tom| 6| 7| 10| 0.3

B| Dick| 3| 8| 7| 0.7

C| Dibs| 5| 2| 3| 0.8

C| Mock| 6| 4| 3| 0.6

D| Sunny| 3| 4| 5| 0.9

D| Lock| 8| 3| 6| 1

我想计算按类别分组的 V1、V2、V3 的加权平均值结果应该如下所示

Class  V1_M  V2_M V3_M

A 9 8 3

B 5 3 3

C 4 4 3

到目前为止,我可以分离每列的数据框。但我感觉效率很低

这是 1 个变量的代码

import pandas as pd
import numpy as np

def wtdavg(frame, var, wb):
d = frame[var]
w = frame[wb]
return (d * w).sum() / w.sum()

df = pd.read_csv('Sample.csv')
Matrix = df.groupby(['Class']).apply(wtdavg,var='V2',wb='wb')
print(Matrix)

我是一个新手,有 1 周的 pandas 经验。提前致谢。

最大

最佳答案

#use apply to calculate weighted mean for alll 3 columns in one go.
df2 = df.groupby('Class').apply(lambda x: pd.Series([sum(x.V1*x.wb)/sum(x.wb), sum(x.V2*x.wb)/sum(x.wb), sum(x.V3*x.wb)/sum(x.wb)]))
#rename columns
df2.columns=['V1_M','V2_M','V3_M']

df2
Out[858]:
V1_M V2_M V3_M
Class
A 9.526316 9.157895 10.684211
B 3.900000 7.700000 7.900000
C 5.428571 2.857143 3.000000
D 5.631579 3.473684 5.526316

更新(值列的动态列表,即 var_cols)

#put all your variable names in a list (can be copied over from df.columns)
var_cols = ['V1', 'V2', 'V3']
df2 = df.groupby('Class').apply(lambda x: pd.Series([sum(x[v] * x.wb) / sum(x.wb) for v in var_cols]))
df2.columns = [e+'_M' for e in var_cols]
V1_M V2_M V3_M
Class
A 9.526316 9.157895 10.684211
B 3.900000 7.700000 7.900000
C 5.428571 2.857143 3.000000
D 5.631579 3.473684 5.526316

关于python - Pandas 数据框中多列的加权平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43949055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com