我有一个包含类别的数据框,我希望通过类别变量对其进行分组,然后应用一些函数f(x),其中x是一个组,并返回一个与该组形状相同的2D数组。
我希望在每个组上应用这个函数,但我需要数据框保持与原始数据框相同的形状和相同的索引。
我已经使用了应用函数,这个函数在每个组上应用f很好,但是却把结果的数据框索引搞乱了,现在是按类别分类的,我需要在应用f之前在原始数据框中的原始索引,我怎样才能实现这个目标?
例如,如果我的输入是下面的 df。
1 0.6 A
2 0.2 B
3 0.5 B
4 0.8 A
这里我有两个组A和B,我希望为每个组应用一个函数f(x),并返回一个相同形状的组,这给我以下的输出使用应用函数。
A 0.6
A 0.8
B 0.2
B 0.5
我如何才能回到旧的数据框架结构?
注意:我不能使用transform,因为我的函数f必须以一组(二维数组)作为输入,然后输出整个组(想想sklearn imputer的fit_transform函数)。 我不能使用transform,因为我的函数f必须把一个组(2D数组)作为输入,然后输出整个组(想想sklearn imputer的fit_transform函数)。
尝试设置 as_index
和 group_keys
的参数,以 pandas.DataFrame.groupby
到 False
- 这可能是你要找的。
as_index: bool, 默认为True
对于聚合输出,返回以组标签为索引的对象。as_index=False实际上是 "SQL式 "的分组输出。
分组标签: bool, 默认为True
调用apply时,在索引中添加组键来识别件。
如果不知道你的函数到底是什么,很难确定这样做是否能做到,但对于像分配新列这样的事情,这很好用。
In [2]: df = pd.DataFrame([[0.6, 'A'], [0.2, 'B'], [0.5, 'B'], [0.8, 'A']])
In [3]: def assign_total_as_col(df):
...: return df.assign(total=float(df[0].sum()))
...:
In [4]: df.groupby(1, as_index=False, group_keys=False).apply(assign_total_as_col)
Out[4]:
0 1 total
0 0.6 A 1.4
3 0.8 A 1.4
1 0.2 B 0.7
2 0.5 B 0.7
Sorting the index of the result frame (with df.sort_index()
)会给你你要找的结果,只要你开始的索引是排序的。