将dplyr的group_by + mutate转换为pandas语法

时间:2018-10-04 09:40:30

标签: pandas dplyr

我正在努力用R的dplyr可以轻松实现一些目标,但是在Python的pandas上却无法做到这一点。请帮助:

让foo_bar(x,y)作为函数,以两个n维向量/ ndarrays x,y作为输入,以n维向量z = foo_bar(x,y)作为输出,并让df为具有3列的数据帧,一个组ID和两个数字列。例如,在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))
}

我想通过分别为每个组(由colum df $ group定义)应用foo_bar向df添加新的列z。在R中,请执行以下操作:

df %>% group_by(group) %>% 
  mutate(
    z = foo_bar(x, y)
  ) %>% ungroup()

问题:如何在熊猫中获得相同的结果? 如果df是pandas 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的语法相比看起来很丑。

0 个答案:

没有答案