Я борюсь с чем-то, чего я могу легко достичь с помощью dplyr R, но не могу сделать то же самое с пандами Python.Помогите:
Пусть foo_bar (x, y) будет функцией с двумя n-мерными векторами / ndarrays x, y в качестве входных данных и n-мерным вектором z = foo_bar (x, y) в качестве выходных и пусть dfбыть фреймом данных с 3 столбцами, идентификатором группы и двумя числовыми столбцами.Например, в R синтаксис df может выглядеть следующим образом:
df <- tibble(
group = c("a", "a", "b", "b", "b"),
x = 1:5,
y = 6:10
)
, а примером foo_bar может быть
foo_bar <- function(x, y) {
return((x + y) / sum(x))
}
. Я хотел бы добавить новый столбец z к df, применив foo_barдля каждой группы (определяется colum df $ group) отдельно.В РИ делают следующее:
df %>% group_by(group) %>%
mutate(
z = foo_bar(x, y)
) %>% ungroup()
Вопрос: Как добиться того же результата в пандах?Если df является пандой DataFrame, я попробовал следующее:
df = pd.DataFrame({'group': list("aabbb"), 'x': np.arange(1, 6), 'y':
np.arange(6, 11)})
# Example foo_bar:
def foo_bar(x, y):
return (x + y) / np.sum(x)
df['z'] = df.groupby('group').transform(lambda data: foo_bar(data['x'], data['y']))
Это вызывает ошибку:
KeyError: ('x', 'occurred at index x') x')
Я также попытался использовать apply вместо transform, что привело к
TypeError: incompatible index of inserted column with frame index
Может, кто-нибудь покажет мне правильный синтаксис?
Обновление: одним из решений является
df['z'] = df.groupby('group').apply(lambda data: foo_bar(data['x'], data['y'])).reset_index()[0]
Выглядит довольно некрасиво по сравнению с синтаксисом dplyr.