除iloc外,按条件为DataFrame赋值列的更快方法(可使用Dask)
更快的DataFrame条件列赋值方法(含Dask实现)
针对你需要的「当feature列值为0时,将package_loss列设为1」的需求,除了iloc,以下几种方法在性能上更优,包括Pandas原生的向量化方案和Dask的大数据并行方案:
Pandas 原生优化方案
1. 使用numpy.where向量化赋值
numpy的向量化操作跳过了loc的索引查找开销,在大数据集上速度显著更快:
import numpy as np df2['package_loss'] = np.where(df2['feature'] == 0, 1, df2['package_loss'])
该方法直接对整列进行批量判断,将满足条件的位置替换为1,其余保留原值。
2. 使用DataFrame.mask方法
mask方法专门用于将满足条件的元素替换为指定值,同样是向量化实现,性能优于loc:
df2['package_loss'] = df2['package_loss'].mask(df2['feature'] == 0, 1)
Dask 大数据并行方案
如果你的数据量超出内存上限,Dask的并行处理能大幅提升效率,实现方式和Pandas类似,但支持分布式计算:
import dask.dataframe as dd # 将Pandas DataFrame转为Dask DataFrame,分区数根据数据规模调整 ddf = dd.from_pandas(df2, npartitions=4) # 方法1:使用Dask的where实现条件赋值 ddf['package_loss'] = dd.where(ddf['feature'] == 0, 1, ddf['package_loss']) # 方法2:使用mask方法 ddf['package_loss'] = ddf['package_loss'].mask(ddf['feature'] == 0, 1) # Dask是懒执行模型,需调用compute()获取最终结果 df_result = ddf.compute()
Dask会将任务拆分到多个分区并行处理,适合TB级别的大数据场景,相比单进程Pandas能获得数倍速度提升。
内容的提问来源于stack exchange,提问作者E McArthur
相关产品推荐
相关产品推荐

