如何将Pandas中耗时的逐行操作转化为高效向量化操作?
优化Pandas百万级数据集的逐行条件操作
处理百万级Pandas数据集时,apply(axis=1)的逐行循环效率极低,以下是几种高效的向量化替代方案,完全匹配你的需求:
方法1:向量化布尔索引(直观高效)
直接利用Pandas的布尔条件批量赋值,避免逐行循环:
import pandas as pd df = pd.DataFrame({'A' : ['Yes', 'No', 'Yes', 'Yes', 'No'], 'B' : ['Blue', 'Red', 'Red', 'Blue', 'Blue']}) # 先给C列设默认值 df['C'] = 'foobar' # 匹配第一个条件,批量赋值 df.loc[(df['A'] == 'Yes') & (df['B'] == 'Blue'), 'C'] = 'foo' # 匹配第二个条件,批量赋值 df.loc[(df['A'] == 'Yes') & (df['B'] == 'Red'), 'C'] = 'bar'
这种方式依赖Pandas的向量化运算,百万级数据下速度比apply快10-100倍,代码逻辑也一目了然。
方法2:用numpy.select管理多条件
如果实际业务中有更多条件分支,np.select能更清晰地组织条件和对应结果:
import numpy as np # 定义条件列表和对应的结果列表 conditions = [ (df['A'] == 'Yes') & (df['B'] == 'Blue'), (df['A'] == 'Yes') & (df['B'] == 'Red') ] choices = ['foo', 'bar'] # 批量生成结果,默认值设为'foobar' df['C'] = np.select(conditions, choices, default='foobar')
新增条件时只需在conditions和choices中添加对应项,扩展性强,性能和布尔索引接近。
方法3:字典映射(适合固定条件组合)
把A、B的组合作为字典键,直接映射结果,这种方式在条件组合固定时速度极快:
# 构建条件组合到结果的映射字典 map_dict = { ('Yes', 'Blue'): 'foo', ('Yes', 'Red'): 'bar' } # 用zip批量组合A、B列,再通过map获取结果 df['C'] = [map_dict.get((a, b), 'foobar') for a, b in zip(df['A'], df['B'])] # 或者更高效的纯批量写法: df['C'] = list(map(map_dict.get, zip(df['A'], df['B']), ['foobar']*len(df)))
这种方式完全避开了Pandas的apply,用原生Python的批量操作实现,速度远超逐行循环。
内容的提问来源于stack exchange,提问作者Anoushiravan R
相关产品推荐
相关产品推荐

