我希望从另一个数据框的 groupby
结果中创建一个新的数据框。结果应该每个组有一行(基本上是矢量化的 map-reduce),并且新列名与现有列名无关。这似乎是使用 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()
会使用Series创建新的列:
d.groupby('a')['b'].agg({'x': lambda g: g.sum()})
x
a
0 7
1 11
但令人沮丧的是,这不能用于DataFrame:
d.groupby('a').agg({'x': lambda g: g.b.sum()})
KeyError: 'x'
我可以通过从apply()
返回一个一行DataFrame来实现:
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
但这样做很丑陋,而且你可以想象,为每一行创建一个新的字典、列表和数据框对于即使是中等规模的输入来说都很慢。