python - 如何使用 pandas 计算加权数据?
问题描述
这里我有一个大数据集
为简单起见,我写了一个简化的例子
import pandas as pd
import numpy as np
indices = (1,2,3,4,5,6)
cols = ["id", "region", "weight", "score1", "score2"]
data = (["xxx1", 1, 2, 10, 20], ["xxx2", 2, 5, 6, 8], ["xxx3", 1, 3, 9, 12], ["xxx4", 1, 3, 12, 20], ["xxx5", 1, 5, 5, 30], ["xxx6", 2, 10, 12, 20])
df = df = pd.DataFrame(data, index = indices, columns = cols)
df
看起来像这样
我只想使用 pandas 和 numpy 包计算加权平均分数,我的理想结果应该是一个 2x3 表,其行是它们所属的区域,列是加权平均 score1 和 score2。下面是我的尝试
def cal(x, w):
assert len(x) == len(w)
nlist = len(x)
sum_weight = np.sum(w)
weight_total = 0
for i in range(nlist):
weight_total = weight_total + x[i] * w[i]
wavg = weight_total / sum_weight
return wavg
但是,我认为这种方法太尴尬了。我想知道是否有更方便的方法来实现相同的目标。欢迎任何提示或帮助
理想的结果
解决方案
尝试分别计算加权总和和重量总和,然后除以:
weighted_total = df.filter(like='score').mul(df.weight, axis=0).groupby(df.region).sum()
sum_weight = df.weight.groupby(df.region).sum()
weighted_total.div(sum_weight, axis=0)
score1 score2
region
1 8.307692 22.0
2 10.000000 16.0
或者在一个单一的groupby
:
df.groupby('region').apply(
lambda g: g.filter(like='score').mul(g.weight, axis=0).sum().div(g.weight.sum(), axis=0)
)
score1 score2
region
1 8.307692 22.0
2 10.000000 16.0
推荐阅读
- c# - 如何从智能卡读取或检索数据(人员信息...)
- c# - Xamarin.Forms 和 Firebase - IDocumentSnapshot 在 for 循环的中途处置
- c# - Blazor WASM(不是托管 asp.net 核心)api 调用?
- clojure - 循环遍历一系列惰性映射并更改其中一个映射中的一个值
- java - 如何使用存储在 sharedPreference 中的字符串?
- reactjs - 用于非自闭合 HTML 元素/React 组件的三元运算符
- javascript - 使用 JavaScript 在移动网站中自动对焦地址栏
- c# - .Net HTMLAgilityPack 正在向标签属性添加空引号
- javascript - 我应该在 webSocket url 中添加什么?
- nginx - 服务器域返回 502 Bad Gateway - Nginx