我想从另一个上的groupby结果创建一个新的数据帧。结果应该每个组有一行(基本上是矢量化的map缩减),并且新的列名与现有的名称没有关系。这似乎是agg的一种自然用法,但它似乎只产生了现有的列。

d = pd.DataFrame({'a': [0,0,1,1], 'b': [3,4,5,6], 'c': [7,8,9,0]})

   a  b  c
0  0  3  7
1  0  4  8
2  1  5  9
3  1  6  0

agg()将创建具有序列的新列:
d.groupby('a')['b'].agg({'x': lambda g: g.sum()})

    x
a
0   7
1  11

但令人沮丧的不是数据帧:
d.groupby('a').agg({'x': lambda g: g.b.sum()})
KeyError: 'x'

我可以通过从apply()返回单行数据帧来完成此操作:
d.groupby('a').apply(lambda g: pd.DataFrame([{'x': g.b.mean(), 'y': (g.b * g.c).sum()}])).reset_index(level=1, drop=True)

     x   y
a
0  3.5  53
1  5.5  45

但这很难看,而且正如您可以想象的那样,为每一行创建一个新的dict、list和DataFrame对于大小适中的输入来说都很慢。

最佳答案

也许这能帮上忙

df = d.groupby('a')[['b','c']].sum()
df.index.name = None
df.columns=['b_sum','c_sum']

或者,如果要计算单个列的单独统计信息,可以执行以下操作
df = d.groupby('a')[['b','c']].apply(lambda x: (x.b.mean(),x.c.sum())).apply(pd.Series)

10-04 14:03
查看更多