假设我有一个具有以下结构的 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
但必须有一个更简单的方法。
最佳答案
由于您的运算符是可交换的,因此您可以执行以下操作:
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
将整个(子)数据帧的每一列作为参数。
关于python - pandas 中涉及两列的聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65996636/