如何更快实现Pandas列的整数编码?(更符合Pandas风格)
优化Pandas列整数编码的方案
直接用Pandas内置的pd.factorize()是最符合惯用写法且效率最高的方案,完全不需要手动实现多进程逻辑——因为Pandas/NumPy的底层实现是C优化的,性能远超Python层面的循环+多进程(多进程的通信开销反而可能拖慢速度)。
核心实现代码
假设你的原始数据是df,一行代码就能完成所有列的整数编码:
encoded_df = df.apply(lambda col: pd.factorize(col)[0])
如果需要保留每列的编码映射关系(和你原函数的输出逻辑一致),可以这样写:
# 存储各列的编码映射 encoding_mappings = {} encoded_df = pd.DataFrame() for col_name in df.columns: # factorize返回(编码后的数组, 原始唯一值数组) encoded_vals, unique_vals = pd.factorize(df[col_name]) encoded_df[col_name] = encoded_vals # 构建映射字典 encoding_mappings[col_name] = dict(zip(unique_vals, range(len(unique_vals))))
为什么这个方案更好
- 性能碾压手动实现:
factorize是Pandas专门为整数编码优化的函数,底层用C实现循环和唯一值计算,比你用np.unique+Python列表推导的速度快数倍,尤其是处理大数据集时。 - 无多进程开销:多进程需要序列化数据、跨进程通信,对于列编码这种计算量不算极端的任务,这些开销会抵消并行带来的收益,反而不如单进程的内置方法快。
- 代码简洁易维护:完全符合Pandas的惯用写法,不需要自己管理进程池、等待任务完成,可读性和可维护性都更高。
极端场景的补充方案
如果你的数据集列数极多且每列数据量超大,确实需要并行加速,可以用swifter库(它会自动判断单/多进程执行):
import swifter encoded_df = df.swifter.apply(lambda col: pd.factorize(col)[0])
内容的提问来源于stack exchange,提问作者sdgaw erzswer
相关产品推荐
相关产品推荐

