如何用向量化操作计算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
相关产品推荐
相关产品推荐

