如何创建agg func处理熊猫除以0?

时间:2018-12-18 18:47:38

标签: pandas

对于我的分析,我需要为RPC重新使用自定义聚合(每次点击收入)。我需要将它们应用于分母为0的边缘情况下的组。

以下方法会发出警告,并将聚合强制转换为inf,而在我的上下文中,NA更合适。

这可能是一个非常简单的问题,但有人可以解释一下:

  • 如何修改aggfunc以便避免被零除。 (不寻求有关如何更改或转换值的帮助)
  • 此警告是否会导致性能问题或意外行为?
  • 通常,如何在aggfunc中添加行级逻辑计算?您将如何添加一列来计算每个组中RPC的stdv?

print(pd.__version__)
clicks = [5, 8, 6, 6, 0, 4, 3, 7, 9, 4]
rev = [2.96, 3.94, 4.83, 2.94, 4.53, 4.66, 3.5 , 4.56, 2.41, 3.77]
group = ['A', 'C', 'C', 'B', 'F', 'D', 'C', 'D', 'A', 'B']
df = pd.DataFrame({'group':group,'clicks':clicks,'rev':rev})

def aggfunc(row):
    d = {
        'rpc' : row['rev'].sum() / row['clicks'].sum(),
        'rev' : row['rev'].sum(),
        'clicks' : row['clicks'].sum()
    }
    return pd.Series(d)

print(df.groupby('group').apply(aggfunc))

0.23.4
            rpc    rev  clicks
group                         
A      0.383571   5.37    14.0
B      0.671000   6.71    10.0
C      0.721765  12.27    17.0
D      0.838182   9.22    11.0
F           inf   4.53     0.0

/Users/jselenkow/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:9: RuntimeWarning: divide by zero encountered in double_scalars
  if __name__ == '__main__':

注意:有关更多信息,我知道您可以在不使用apply函数的情况下进行求和,但是我发现此方法有用且方便,因为我可以定义要保留的列

1 个答案:

答案 0 :(得分:2)

尝试一下:

def aggfunc(row):
    d = {
        'rpc' : row['rev'].sum() / row['clicks'].sum() if row['clicks'].sum() != 0 else np.nan,
        'rev' : row['rev'].sum(),
        'clicks' : row['clicks'].sum()
    }
    return pd.Series(d)

输出:

            rpc    rev  clicks
group                         
A      0.383571   5.37    14.0
B      0.671000   6.71    10.0
C      0.721765  12.27    17.0
D      0.838182   9.22    11.0
F           NaN   4.53     0.0