如何在各组上应用函数,并保持数据框的形状不变。

问题描述 投票:0回答:1

我有一个包含类别的数据框,我希望通过类别变量对其进行分组,然后应用一些函数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函数)。

python pandas dataframe pandas-groupby
1个回答
0
投票

尝试设置 as_indexgroup_keys 的参数,以 pandas.DataFrame.groupbyFalse- 这可能是你要找的。

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())会给你你要找的结果,只要你开始的索引是排序的。

© www.soinside.com 2019 - 2024. All rights reserved.