Python 熊猫加权平均计算中分子和分母的复制情况
熊猫新手正在尝试将sql复制到python。 参考下面的文章,我可以使用一个简单的函数来计算数据帧中一列的加权平均值 但是,如果我在分子和分母中都有条件,并且要得到加权平均值的总和,我会在sql中执行以下操作:Python 熊猫加权平均计算中分子和分母的复制情况,python,pandas,Python,Pandas,熊猫新手正在尝试将sql复制到python。 参考下面的文章,我可以使用一个简单的函数来计算数据帧中一列的加权平均值 但是,如果我在分子和分母中都有条件,并且要得到加权平均值的总和,我会在sql中执行以下操作: SELECT date , id , SUM(CASE WHEN value IS NOT NULL THEN value * wt ELSE 0 END) / NULLIF(SUM(CASE WHEN value > 0 THEN wt
SELECT
date
, id
, SUM(CASE WHEN value IS NOT NULL THEN value * wt ELSE 0 END) /
NULLIF(SUM(CASE WHEN value > 0 THEN wt ELSE 0 END), 0)
AS wt_avg
FROM table
GROUP BY date, id
我们如何在大熊猫身上复制这一点
提前感谢。考虑根据指定的逻辑,使用np.where替换CASE语句和Series.fillna作为NULLIF的对应项,使用计算的helper列
你确定这个公式吗?您不希望分母为零。谢谢@Parfait-我将尝试上面的方法。所以,如果我们有多个列,我们只会扩展相同的列,对吗?所以,它将是wt_avg1、wt_avg2等等……太棒了!很乐意帮忙。快乐编码!
SELECT
date
, id
, SUM(CASE WHEN value IS NOT NULL THEN value * wt ELSE 0 END) /
NULLIF(SUM(CASE WHEN value > 0 THEN wt ELSE 0 END), 0)
AS wt_avg
FROM table
GROUP BY date, id
df['numer'] = np.where(pd.notnull(df['value']), df['value'] * df['wt'], 0)
df['denom'] = pd.Series(np.where(df['value'] > 0, df['wt'], 0)).fillna(0)
df['wt_avg'] = (df.groupby(['Date', 'ID'])['numer'].transform(sum) /
df.groupby(['Date', 'ID'])['denom'].transform(sum))
print(df)
# print(df.drop(columns=['numer', 'denom'])) # DROP HELPER COLUMNS
# Date ID wt value numer denom wt_avg
# 0 01/01/2012 100 0.50 60.0 30.0 0.5 60.0
# 1 01/01/2012 101 0.75 NaN 0.0 0.0 NaN
# 2 01/01/2012 102 1.00 100.0 100.0 1.0 100.0
# 3 01/02/2012 201 0.50 NaN 0.0 0.0 NaN
# 4 01/02/2012 202 1.00 80.0 80.0 1.0 80.0