熊猫groupby返回额外索引

时间:2019-06-08 17:22:43

标签: python pandas group-by

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,以便每个组都返回一个数据框,像这样

    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

执行以下操作会增加一列编号索引:

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

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

dft.groupby(['C1','C2']).apply(lam3).reset_index().drop(columns='level_2')

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

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

问题类似于this,但此处的每个组都返回一个数据框,而不是一个序列。

编辑: 此处的lam3只是用于演示的示例函数。在实际版本中,可能存在取决于df的操作。关键是lam3函数在groupby上下文中返回一个数据帧。因此交叉连接无济于事

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

在您的分组依据中使用group_keys=False

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