如何用函数更新DataFrame子集?Python高效数据清洗方法求教
Pandas 数据清洗循环优化方案
原代码用iterrows()逐行遍历处理,会完全绕开Pandas的向量化优化,在数据量大时性能极差。下面是符合Pandas设计逻辑的高效实现方式:
import numpy as np import pandas as pd def multiply_values(self, variables: list, multiplier: int): # 统一处理tag_result列:将"-"转为NaN,同时把字符串型数值转成浮点型 self.df['tag_result'] = pd.to_numeric(self.df['tag_result'], errors='coerce') # 生成筛选掩码:选出tpsw_id_core在目标列表中的行 target_mask = self.df['tpsw_id_core'].isin(variables) # 向量化处理目标行的tag_result self.df.loc[target_mask, 'tag_result'] = np.where( self.df.loc[target_mask, 'tag_result'].isna(), 0, self.df.loc[target_mask, 'tag_result'] * multiplier ).round().astype(int)
关键优化点:
- 类型统一预处理:用
pd.to_numeric一次性完成字符串转数值、异常值转NaN的操作,避免逐行判断"-"和空值的冗余逻辑。 - 向量化筛选:用
isin生成布尔掩码批量定位目标行,替代循环中的条件判断。 - 向量化赋值:用
np.where实现批量条件赋值,比逐行调用df.at效率提升几个数量级,数据量越大优势越明显。
如果之前尝试.loc或np.where失败,大概率是因为没有先将tag_result转为数值类型——原列中混合了字符串(如"-")和数值字符串,直接进行乘法运算会触发类型错误,预处理转成数值型是核心前提。
内容的提问来源于stack exchange,提问作者Peter Bajci
相关产品推荐
相关产品推荐

