Перевод dplyr group_by + mutate в синтаксис панд - PullRequest
0 голосов
/ 04 октября 2018

Я борюсь с чем-то, чего я могу легко достичь с помощью 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...