Pandas 500万行数据集下生成条件校验标识列的高效实现咨询
500万行Pandas DataFrame生成flag列的高效方案
直接使用矢量化运算即可实现需求,全程无Python层面的循环,性能完全可以支撑500万行规模的数据处理:
核心代码
import pandas as pd import numpy as np # 示例数据(你的实际数据可直接替换) df = pd.DataFrame({'id': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 'opn1': [20180301, 20180401, 20180501, 20180601, 20180701, 20180801, 20180901, 20181001, 20181101, 20181201], 'opn2': [20180401, 20180501, 20180601, 20180701, 20180801, 20180901, 20181001, 20181101, 20181201, 20190101], 'opn3': [20180501, 20180601, 20180701, 20180801, 20180901, 20181001, 20181101, 20181201, 20190101, 20190201], 'opn4': [20180601, 20180701, 20180801, 20180901, 20181001, 20181101, 20181201, 20190101, 20190201, 20190301], 'opn5': [20180701, 20180801, 20180901, 20181001, 20181101, 20181201, 20190101, 20190201, 20190301, 20190401], 'cls1': [0, 20180520, 0, 0, 0, 0, 0, 0, 0, 0], 'cls2': [0, 0, 0, 0, 20181031, 0, 0, 0, 0, 0], 'cls3': [0, 0, 20180725, 0, 20180701, 0, 0, 0, 0, 0], 'cls4': [0, 0, 0, 0, 0, 0, 20190101, 0, 0, 0], 'cls5': [0, 20180731, 0, 0, 0, 0, 0, 0, 0, 20190510], }) # 提取对应编号的开启、关闭列 opn_cols = [f'opn{i}' for i in range(1, 6)] cls_cols = [f'cls{i}' for i in range(1, 6)] # 核心计算逻辑:排除cls为0的无效值后,逐对比较是否满足cls < opn,任意一组满足则flag为1 df['flag'] = ((df[cls_cols] != 0) & (df[cls_cols] < df[opn_cols].to_numpy())).any(axis=1).astype(int)
方案说明
- 所有运算均为矢量化操作,底层在C层面执行,500万行数据处理耗时通常在1秒以内,远快于
apply、iterrows等循环方案 - 若你习惯使用
np.where,也可以替换最后一行代码为:
df['flag'] = np.where(((df[cls_cols] != 0) & (df[cls_cols] < df[opn_cols].values)).any(axis=1), 1, 0)
两种写法性能差异极小,输出结果完全一致。
- 如果需要极致性能,可以直接基于NumPy数组计算,进一步降低Pandas的索引开销:
opn_arr = df[opn_cols].to_numpy() cls_arr = df[cls_cols].to_numpy() mask = (cls_arr != 0) & (cls_arr < opn_arr) df['flag'] = mask.any(axis=1).astype(int)
内容的提问来源于stack exchange,提问作者Abhishek Jain
相关产品推荐
相关产品推荐

