Pandas的groupby返回了额外的索引。

3
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将无法帮助

这个所谓的交叉连接 - undefined
这里只是一个示例函数,用于演示。在真实版本中,有一些依赖于df的操作。关键是lam3函数在groupby的上下文中返回一个数据框。 - undefined
https://github.com/pandas-dev/pandas/issues/22546 - undefined
2个回答

5

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

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

3

在你的groupby中使用group_keys=False

dft.groupby(['C1','C2'], group_keys=False).apply(lam3)


是我一个人还是最近的pandas不再起作用了?我用的是2.1.0版本进行测试。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接