对于我的分析,我需要为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函数的情况下进行求和,但是我发现此方法有用且方便,因为我可以定义要保留的列
答案 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