#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))