dft = pd.DataFrame({'C1': ['A','A','B','B'],
'C2': [1,2,3,4]})
def lam3(df):
return pd.DataFrame({'X': ['C','D','E'],
'Y': [11,22,33]})
给定上述数据框和函数(无法更改),我想运行groupby+apply,使每个组返回一个数据框,如下所示
Original Answer翻译成"最初的回答"
C1 C2 X Y
0 A 1 C 11
1 A 1 D 22
2 A 1 E 33
3 A 2 C 11
4 A 2 D 22
5 A 2 E 33
6 B 3 C 11
7 B 3 D 22
8 B 3 E 33
9 B 4 C 11
10 B 4 D 22
11 B 4 E 33
执行以下操作会多出一列编号索引:
Original Answer 翻译成 "最初的回答"
dft.groupby(['C1','C2']).apply(lam3)
我需要按照以下步骤才能得到我想要的:
最初的回答:
dft.groupby(['C1','C2']).apply(lam3).reset_index().drop(columns='level_2')
显然,这不是通用的,因为level_2取决于我在分组中使用了多少列,并且盲目删除以“level”开头的列可能会删除原始列。
如何在groupby中使用返回dataframe的lambda函数而不返回额外索引?
这个问题类似于这个,但是每个组在这里返回一个dataframe,而不是一个series。
编辑:这里的lam3只是演示示例函数。在实际版本中,可以有依赖于df的操作。关键是lam3函数在groupby上下文中返回dataframe。因此,cross-join将无法帮助