Python pandas groupby返回额外的索引 dft=pd.DataFrame({'C1':['A','A','B','B'], ‘C2’:[1,2,3,4]}) def lam3(df): 返回pd.DataFrame({'X':['C','D','E'], ‘Y’:[11,22,33]})

Python pandas groupby返回额外的索引 dft=pd.DataFrame({'C1':['A','A','B','B'], ‘C2’:[1,2,3,4]}) def lam3(df): 返回pd.DataFrame({'X':['C','D','E'], ‘Y’:[11,22,33]}),python,pandas,group-by,Python,Pandas,Group By,鉴于上述数据帧和函数(我无法更改),我希望运行groupby+apply,以便每个组返回一个数据帧,如下所示 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 6B3C11 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 执行以下操作将提供一列额外的数字索引: dft.groupby(['C1','C2']).apply(lam

鉴于上述数据帧和函数(我无法更改),我希望运行groupby+apply,以便每个组返回一个数据帧,如下所示

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
6B3C11
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
执行以下操作将提供一列额外的数字索引:

dft.groupby(['C1','C2']).apply(lam3)
因此,我必须执行以下操作才能得到我想要的:

dft.groupby(['C1','C2']).apply(lam3).reset_index().drop(columns='level_2')
显然,这不是通用的,因为level_2取决于我在groupby中使用了多少列,盲目删除以“level”开头的列可能会删除原始列

如何使用lambda函数返回groupby中的数据帧而不返回额外的索引

问题类似于,但这里的每个组都返回一个数据帧,而不是一个序列

编辑:
这里的lam3只是一个示例函数,用于演示。在实际版本中,可能存在依赖于df的操作。关键是lam3函数在groupby的上下文中返回一个数据帧。因此交叉连接没有帮助

重置索引
允许您按顺序删除索引,并提供删除选项。因此,您可以尝试:

dft.groupby(['C1','C2']).apply(lam3).reset_index(level=-1, drop=True) 
输出:

       X   Y
C1 C2       
A  1   C  11
   1   D  22
   1   E  33
   2   C  11
   2   D  22
   2   E  33
B  3   C  11
   3   D  22
   3   E  33
   4   C  11
   4   D  22
   4   E  33

在groupby中使用
group\u keys=False


dft.groupby(['C1','C2'],group_keys=False)。应用(lam3)

这里所谓的交叉连接lam3只是一个示例函数,用于演示。在实际版本中,有一些操作依赖于df。关键是lam3函数在groupby的上下文中返回一个数据帧。