假设我有一个具有以下结构的 Pandas 数据框:
df = pd.DataFrame(dict(a=["x", "x", "y"], b=[0, 1, 1], c=[1, 2, 2]))
我想按 a
聚合分组并进行依赖于 b
和 c
的聚合。我想做类似的事情:
df.groupby("a").agg(lambda df: (df["b"] - df["c"]).sum())
但这会在 Pandas 中引发以下错误:
KeyError: 'b'
有没有一种简单的方法可以在 Pandas 中做到这一点?
当然我知道我可以做类似的事情
df.assign(new_b = lambda df: df["b"] - df["c"]).groupby("a").agg({"new_b": 'sum'})
得到以下结果:
new_b
a
x -2
y -1
但必须有更简单的方法。
答案 0 :(得分:2)
由于您的运算符是可交换的,您可以这样做:
out = df.groupby('a').sum()
out['new_b'] = out['b'] - out['c']
输出:
b c new_b
a
x 1 3 -2
y 1 2 -1
注意:您已经接近了,这会起作用
df.groupby("a").apply(lambda d: (d["b"] - d["c"]).sum())
区别在于 apply
将整个(子)数据帧作为参数,而 agg
将整个(子)数据帧的每一列作为参数。