如何高效实现DataFrame中Month列到Year列的值映射(替代循环)
嘿,我懂你现在的痛点——用for循环处理虽然能实现需求,但在Pandas里确实有更高效、更符合Pandas风格的向量化方法,不管是代码简洁度还是处理大数据集的速度都完胜循环。下面给你两种常用的优化方案:
方案一:提取后缀映射年份
这种方法适合后缀规则固定的场景,先从Month列里提取出后缀的数字,再通过映射表转换成对应年份:
import pandas as pd # 提取后缀数字,没有后缀的填充为'0' Products['year_suffix'] = Products['Month'].str.extract(r'\.(\d)?', expand=False).fillna('0') # 定义后缀到年份的映射关系 year_mapping = {'0': '2015', '1': '2016', '2': '2017'} # 生成Year列 Products['Year'] = Products['year_suffix'].map(year_mapping) # 不需要中间列的话可以删掉 Products.drop('year_suffix', axis=1, inplace=True)
方案二:链式条件判断(numpy.where)
如果你的条件不多(就这三个年份),用numpy.where链式判断会更直接,一行代码搞定:
import numpy as np Products['Year'] = np.where( Products['Month'].str.contains('\.1'), '2016', np.where(Products['Month'].str.contains('\.2'), '2017', '2015') )
为什么这些方法更好?
- 速度更快:Pandas的向量化操作是基于底层C实现的,比Python层面的for循环效率高几个量级,数据量越大差距越明显;
- 代码更简洁:不用手动遍历每一行,逻辑一目了然;
- 避免警告:原来的循环方式直接修改
Products['Year'][i]属于链式索引,很容易触发SettingWithCopyWarning,向量化方法则不会有这个问题。
内容的提问来源于stack exchange,提问作者Breton
相关产品推荐
相关产品推荐

