我想从另一个上的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)