如何用if/else块实现Pandas DataFrame高效数据验证?
DataFrame数据验证:可读性与性能的平衡方案
我们使用DataFrame存储采集到的数据,提交前需依据规则列表完成数据验证。在Python中搭建验证逻辑时,遇到了可读性与性能难以兼顾的问题。
示例验证规则
当
F_System = 1、Facility_Type属于{1,2,6}且Pav_Rep_Method = 2时,Dir_Through_Lanes字段必须非空。
现有两种实现方式
1. apply逐行验证法
def sjpm201a(self): def sjpm201_check(row): print(row) if row['F_SYSTEM'] == 1 and row['FACILITY_TYPE'] in [1,2,6] and row['PAVE_REP_METHOD'] == 2: if row['DIR_THROUGH_LANES'] == np.nan: row['SJPM201'] = False return row row['SJPM201a'] = True return row self.df = self.df.apply(sjpm201_check, axis=1)
- 优势:逻辑直观,易编写、易维护
- 劣势:性能差,运行耗时约22秒
2. 布尔索引批量验证法
def sjpm201b(self): df = self.df self.df['SJPM201b'] = ((df['DIR_THROUGH_LANES'].notna()) | ((df['F_SYSTEM'] != 1) | (~df['FACILITY_TYPE'].isin([1,2,6])) | (df['PAVE_REP_METHOD'] != 2)))
- 优势:性能极佳,运行耗时仅约0.01秒
- 劣势:逻辑嵌套复杂(需转换与/或关系),规则越长越难编写和理解
需求
我们有上百条类似的验证规则,希望找到一种方案:既能用直观的if/else块编写逻辑,又能达到布尔索引级别的性能。
内容的提问来源于stack exchange,提问作者Sea Bacon
相关产品推荐
相关产品推荐

