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上下文中返回一个数据帧。因此交叉连接无济于事
答案 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)