我正在安装排名系统,基本上我有一个名为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

关于python - 用 Pandas 计算加权平均值以降低成本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56149791/

10-12 20:14