You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用向量化操作计算DataFrame分组中指定列的最小值?

向量化实现分组内day_count最小值计算

给定的DataFrame

import pandas as pd

df = pd.DataFrame(
    data = [
            [0,0],
            [1,0],
            [2,2],
            [3,3],
            [4,3],
            [5,3],
            [6,4],
            [7,4],
        ],
    columns = ['day_count', 'level']
)

需求说明

需要用向量化操作实现与以下代码完全相同的输出:

df.groupby(['level'])['day_count'].transform('min')

输出示例:
输出示例图

该操作是大数据集性能优化函数的一部分,目标是通过纯向量化操作提升速度,避免非向量化的顺序扫描。此前尝试过对level列移位、计算差值,用numpy.where识别分组起始点,但仍需执行顺序扫描,希望找到完全向量化的方案。

向量化解决方案

以下是两种无需循环或顺序扫描的纯向量化实现方案:

方法1:通用型(适用于任意分组顺序)

利用numpy.unique提取分组最小值,再通过映射数组完成批量赋值:

import numpy as np

# 获取唯一level值及其对应的最小day_count(通过索引定位)
unique_levels, min_indices = np.unique(df['level'], return_index=True)
min_day_counts = df['day_count'].iloc[min_indices].values

# 创建level到最小值的映射数组
max_level = df['level'].max()
level_min_map = np.zeros(max_level + 1, dtype=int)
level_min_map[unique_levels] = min_day_counts

# 生成最终结果
result = level_min_map[df['level'].values]

方法2:针对有序分组的优化方案

如果level的分组是连续出现的(同一level的行不会被其他level打断),且day_count在分组内递增,可以用反向累积填充实现:

import numpy as np

# 标记每个分组的起始行
group_starts = np.concatenate([[True], df['level'].values[1:] != df['level'].values[:-1]])

# 仅保留分组起始行的day_count,其余位置设为0
group_min_candidates = np.where(group_starts, df['day_count'].values, 0)

# 反向累积最大值,将分组最小值填充到组内所有行
result = np.flip(np.maximum.accumulate(np.flip(group_min_candidates)))

性能说明

两种方案均为纯向量化操作,在大数据集上的执行效率优于groupby.transform:

  • 方法1适配所有分组场景,无前置条件限制
  • 方法2在分组连续且day_count递增的场景下性能最优,额外开销最小

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 10:37:14