我正在努力用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的语法相比看起来很丑。