pandas groupby 返回额外索引

iwb*_*abn 3 python group-by pandas

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]})
Run Code Online (Sandbox Code Playgroud)

给定上述数据帧和函数(我无法更改),我想运行 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
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
Run Code Online (Sandbox Code Playgroud)

执行以下操作会给出一个额外的数字索引列:

dft.groupby(['C1','C2']).apply(lam3)
Run Code Online (Sandbox Code Playgroud)

所以我必须执行以下操作才能得到我想要的:

dft.groupby(['C1','C2']).apply(lam3).reset_index().drop(columns='level_2')
Run Code Online (Sandbox Code Playgroud)

显然,这不是通用的,因为 level_2 取决于我在 groupby 中使用的列数,并且盲目删除以“level”开头的列可能会删除原始列。

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

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

编辑: lam3 这里只是一个用于演示的示例函数。在真实版本中,可以有依赖于df的操作。重点是 lam3 函数在 groupby 的上下文中返回一个数据帧。所以交叉连接没有帮助

Qua*_*ang 5

reset_index让您可以按顺序删除索引,并提供删除选项。所以你可以尝试:

dft.groupby(['C1','C2']).apply(lam3).reset_index(level=-1, drop=True) 
Run Code Online (Sandbox Code Playgroud)

输出:

       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
Run Code Online (Sandbox Code Playgroud)