Как создать agg func для обработки деления на 0 в пандах? - PullRequest
0 голосов
/ 18 декабря 2018

Для моего анализа мне нужно повторно использовать пользовательские агрегаты для RPC (доход за клик).Мне нужно применить их к группам, которые могут иметь крайние случаи, когда знаменатель равен 0.

Приведенный ниже метод выдает предупреждение и приводит к агрегации как inf, тогда как в моем контексте NA более уместно.

Вероятно, это очень простой вопрос, но кто-то может объяснить, пожалуйста:

  • , как изменить aggfunc, чтобы избежать деления на ноль.(не обращаясь за помощью в том, как изменить или привести значения)
  • вызывает ли это предупреждение какие-либо проблемы с производительностью или непредвиденное поведение?
  • в целом, как вы добавляете логические вычисления на уровне строк вaggfunc?Как бы вы добавили столбец, который вычисляет стандартное значение RPC в каждой группе?

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__':

Примечание: для большего контекста - я знаю, что вы можете делать суммы без использования функции применения,но я считаю этот метод полезным и удобным, поскольку я могу определить, какие столбцы сохранить

1 Ответ

0 голосов
/ 18 декабря 2018

Попробуйте это:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...