大样本DataFrame行筛选与逐行累积比率计算优化需求
高效处理百万级DataFrame的累积统计方案
你这情况我太熟了——400万行的DataFrame用循环遍历,那效率简直是灾难,毕竟O(n²)的时间复杂度在百万级数据面前完全扛不住。下面给你用Pandas的向量化操作来搞定这两个核心任务,速度能提升好几个数量级!
任务1:筛选特定列值在[1, 当前行]范围内存在的行
假设你的DataFrame名为df,目标列是name,要匹配的目标值是'X'。我们可以通过两步向量化操作快速筛选:
import pandas as pd # 第一步:标记每行的name是否等于目标值'X' df['is_target'] = df['name'] == 'X' # 第二步:计算累积求和,只要累积和大于0,说明从第1行到当前行至少出现过一次'X' df['has_target_so_far'] = df['is_target'].cumsum() > 0 # 筛选出符合条件的行 filtered_rows = df[df['has_target_so_far']]
这个方案全程没有循环,底层是C实现的向量化运算,处理400万行基本是秒级完成。
任务2:计算逐行累积的True/False数量比率
基于上面生成的is_target布尔列,我们可以直接用累积统计函数计算比率,然后生成新的结果DataFrame:
import numpy as np # 累积统计True的数量 cum_true_counts = df['is_target'].cumsum() # 累积统计总行数(等价于从1到len(df)的序列) cum_total_counts = np.arange(1, len(df) + 1) # 计算累积比率 cum_ratios = cum_true_counts / cum_total_counts # 生成结果DataFrame result_df = pd.DataFrame({ '累积True数量': cum_true_counts, '累积总行数': cum_total_counts, 'True/False比率': cum_ratios })
这里用numpy.arange生成总行数序列,比手动计数快得多;所有操作都是向量化的,完全适配百万级数据规模,不会出现卡顿。
额外提示
如果你的True/False判断不是基于name='X',而是其他布尔列,只需要把df['is_target']替换成对应的布尔列即可。另外,Pandas的各类累积函数(cumsum、cummin、cummax等)都是经过高度优化的,性能远优于Python循环,是处理大数据量的首选方案。
内容的提问来源于stack exchange,提问作者Mahboob Mustafa
相关产品推荐
相关产品推荐

