使用 Pandas 计算加权平均值以降低成本

Calculate weighted average with Pandas for decreasing cost

我正在安装一个排名系统,基本上我有一个名为site_fees的字段,占总数的10%供考虑。 0 的网站费用将获得所有 10 分。我想做的是计算非零字段将得到多少分,但我正在努力这样做。

我最初的方法是将数据帧拆分为 2 个数据帧(dfb,其中 site_fees 为 0,dfa > 0)并计算 dfa 的平均值,将 dfb 的评分指定为 10,然后结合两者。

代码如下:

dfSitesa = dfSites[dfSites['site_fees'].notnull()]
dfSitesb = dfSites[dfSites['site_fees'].isnull()]
dfSitesa['rating'] = FeeWeight * \
dfSitesa['site_fees'].min()/dfSitesa['site_fees']
dfSitesb['rating'] = FeeWeight
dfSites = pd.concat([dfSitesa,dfSitesb])

这会产生一个输出,但是 dfa 的结果不正确,因为 dfa 的最小值是 5000 而不是 0,因此费用为 5000 美元的网站的评级是 10(最大值,不正确)。我做错了什么?

最小非零 site_fee 是 5000,最大值是 15000。基于此,我希望通用排名系统如下:

15000 | 0
10000 | 3.3
5000  | 6.6
0     | 10

这是一种方法:

dfSites = pd.DataFrame({'site_fees':[0,1,2,3,5]})
FeeWeight = 10

dfSitesa = dfSites[dfSites['site_fees'].notnull()]
dfSitesb = dfSites[dfSites['site_fees'].isnull()]
dfSitesb['rating'] = FeeWeight
factor = (dfSitesa['site_fees'].max() - dfSitesa['site_fees'].min())
dfSitesa['rating'] = FeeWeight * ( 1 - ( (dfSitesa['site_fees'] -  dfSitesa['site_fees'].min()) / factor) )
dfSites = pd.concat([dfSitesa,dfSitesb])

In [1] : print(dfSites)
Out[1] : 
site_fees   rating
0   0   10.0
1   1   8.0
2   2   6.0
3   3   4.0
4   5   0.0