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 的上下文中返回一个数据帧。所以交叉连接没有帮助
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)