如何在每个组上应用功能并保持相同形状的数据框

Posted

技术标签:

【中文标题】如何在每个组上应用功能并保持相同形状的数据框【英文标题】:How to apply function on each group and keep same shape of dataframe 【发布时间】:2020-05-27 01:48:30 【问题描述】:

我有一个包含类别的数据框,我希望按类别变量对其进行分组,然后应用一些函数 f(x),其中 x 是一个组,并返回一个与该组形状相同的二维数组。

我希望在每个组上应用此功能,但我需要数据框保持与原始数据框相同的形状和相同的索引。

我已经使用了apply函数,这对每个组都很好地应用了f,但是现在按类别生成的数据帧索引弄乱了,我需要在应用f之前在原始数据帧中的原始索引,我该如何实现?

例如,如果我的输入是以下 df:

1  0.6 A
2  0.2 B
3  0.5 B
4  0.8 A

这里我有两个组 A 和 B,我希望为每个组应用一个函数 f(x) 并返回一个相同形状的组,这给我使用 apply 函数的以下输出

A 0.6
A 0.8
B 0.2
B 0.5

我怎样才能回到旧的数据框结构

注意:我不能使用变换,因为我的函数 f 必须将一组(2D 数组)作为输入并输出整个组(想想 sklearn imputer 的 fit_transform 函数)

【问题讨论】:

【参考方案1】:

尝试将 as_indexgroup_keys 参数设置为 pandas.DataFrame.groupbyFalse - 这可能是您要查找的内容:

as_index:布尔型,默认为真

对于聚合输出,返回以组标签为索引的对象。仅与 DataFrame 输入相关。 as_index=False 实际上是“SQL 风格”的分组输出。

group_keys: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

对结果帧的索引进行排序(使用df.sort_index())将为您提供您正在寻找的结果,只要您开始使用的索引已排序。

【讨论】:

以上是关于如何在每个组上应用功能并保持相同形状的数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 Pandas 保持数据框形状相同的同时删除丢失的数据和 0?

如何保持鼠标相对于屏幕的位置并忽略组件旋转?

如何将*多个*功能应用于熊猫 groupby 应用?

如何在保持相同形状和尺寸的同时获得 tensorflow 数据集中的最大值?

偏移图像框内的平铺形状

如何在 PHP CodeIgniter 中保存文本框中输入的数据