使用 panda apply() 函数将每个子组的所有值替换为子组最小值(无循环)

Posted

技术标签:

【中文标题】使用 panda apply() 函数将每个子组的所有值替换为子组最小值(无循环)【英文标题】:Replace all values for every subgroups with subgroup min value with panda apply() function (without loop) 【发布时间】:2022-01-24 00:04:49 【问题描述】:

我有一个熊猫数据框 df:

DIFF_HOURS  DIFF_TEMP
0   0.0     0.050886
1   1.0     0.660698
2   2.0     1.656014
3   3.0     2.543857
4   4.0     3.071813
...     ...     ...
627647  68.0    -1.708911
627648  69.0    -1.225022
627649  70.0    -2.040668
627650  71.0    -2.738665

对于数据可视化,我使用 x=DIFF_HOURS 和 y=DIFF_TEMP 绘制各种箱线图。

我想要 6 小时的分组:

Group 1: 0, 1, 2, 3,4,6
Group 2: 7,8,9,10,11,12
...
Group n: 66,67,68,69,70,71,72

并将每个子组的所有值替换为最小子组值:

Group 1: 0,0,0,0,0,0
Group 2: 7,7,7,7,7,7
...
Group n: 66,66,66,66,66,66

我不想使用循环。请问可以用panda apply()函数吗?

【问题讨论】:

apply 和使用循环一样低效 小时是连续的吗?请提供一个最小的可重现示例。您当前的示例不明确,因为您显然有 627650 行但只有 71 小时 @mozway: 627650 / 365 / 24 几乎等于 72 您好,抱歉。我只有 72 个不同的时间,但重复相同的时间。 【参考方案1】:

我的解决方案运行良好且快速:

every_hours = 6
max_periode = 72

for i in range(0, max_periode, every_hours):
      df.loc[(df['DIFF_HOURS'] > i) & (df['DIFF_HOURS'] <= (i+6)), 'DIFF_HOURS'] = i

【讨论】:

【参考方案2】:

试试这个:

df.groupby(df['DIFF_HOURS'].mod(6).eq(0).cumsum())['DIFF_HOURS'].apply(lambda x: [x.min()]*6)

【讨论】:

您好,谢谢。如果我只有 72 个不同的时间,那么相同的时间会重复几次。

以上是关于使用 panda apply() 函数将每个子组的所有值替换为子组最小值(无循环)的主要内容,如果未能解决你的问题,请参考以下文章

使用带有参数的 Pandas groupby() + apply()

Pandas Dataframe:获取组内每个子组的第一行的平均值

pandas使用apply函数:在dataframe数据列(column)上施加(apply)函数

pandas使用apply函数:在dataframe数据行(row)上施加(apply)函数

在不使用php内置函数的情况下将每5个数字数组的排序从升序更改为降序,反之亦然

pandas编写自定义函数使用apply函数应用自定义函数基于Series数据生成新的dataframe