Применение пользовательской функции к объекту groupby

#python #pandas #dataframe

#python #панды #фрейм данных

Вопрос:

У меня есть фрейм данных:

 pri_col col1 col2        Date
     r1    3    4  2020-09-10
     r1    4    1  2020-09-10
     r2    2    7  2020-09-11
     r2    6    4  2020-09-11
  

Я выполняю groupby для столбцов pri_col и date, а затем применяю функцию к остальным столбцам.

Но проблема здесь в том, что мне нужно принять функцию в качестве входных данных от пользователя. Например.

 func = input('Function to use: ')
ret_df = ip_df.groupby(['pri_col','date']).apply(eval(func))
  

Но это также применяет функцию к pri_col и date, что нежелательно.

Например. Если пользователь вводит «сумму» в качестве входных данных, я хочу, чтобы конечный результат был таким,

 pri_col col1 col2        Date
     r1    7    5   2020-09-10
     r2    8    11  2020-09-11
  

Есть ли какой-либо другой подход к этой проблеме? Я попытался удалить .apply() и использовать .eval() напрямую, но мы не можем сделать это с объектом groupby.

Ответ №1:

Используйте этот трюк — преобразуйте столбцы в MultiIndex , чтобы не обрабатывать с помощью функции:

 ret_df = ip_df.set_index(['pri_col','date']).groupby(['pri_col','date']).apply(eval(func))
  

Для более старой версии pandas используйте:

 ret_df = ip_df.set_index(['pri_col','date']).groupby(level=[0, 1]).apply(eval(func))