如何在Python中按嵌套列表映射批量替换DataFrame列值?
解决DataFrame指定列按嵌套列表映射替换的问题
我来帮你搞定这个问题!你之前写的循环没生效,核心原因是:遍历df['Country']时拿到的是列元素的副本,修改item变量根本不会同步到原DataFrame里的数据。下面给你几种实用且高效的实现方案:
方法1:转字典+replace矢量化替换(推荐)
这是最简洁、性能最好的方式,利用pandas的矢量化操作,比循环快得多,尤其适合大数据集:
import pandas as pd df = pd.read_csv('test.csv') geos = [['Estados Unidos','US - Estados Unidos'],['Estonia','EE - Estonia']] # 把嵌套列表转换成「旧值:新值」的映射字典 geo_mapping = {old_val: new_val for old_val, new_val in geos} # 批量替换指定列的匹配值 df['Country'] = df['Country'].replace(geo_mapping)
执行后,原DataFrame里的Estados Unidos会被替换成US - Estados Unidos,不在映射列表里的Perú会保持原样。
方法2:用loc索引精准修改(循环版)
如果一定要用循环实现,得通过索引定位到原DataFrame的行来修改,而不是修改遍历出来的副本:
import pandas as pd df = pd.read_csv('test.csv') geos = [['Estados Unidos','US - Estados Unidos'],['Estonia','EE - Estonia']] for old_val, new_val in geos: # 用loc定位所有匹配旧值的行,直接修改Country列 df.loc[df['Country'] == old_val, 'Country'] = new_val
这种方式虽然能生效,但数据量大时效率不如方法1,不推荐优先使用。
方法3:apply自定义替换逻辑
如果你的映射规则更复杂(比如需要模糊匹配),可以用apply自定义函数处理:
import pandas as pd df = pd.read_csv('test.csv') geos = [['Estados Unidos','US - Estados Unidos'],['Estonia','EE - Estonia']] def replace_country(country_name): for old_val, new_val in geos: if country_name == old_val: return new_val return country_name # 没有匹配到就返回原值 df['Country'] = df['Country'].apply(replace_country)
这种方式灵活性高,但同样不如矢量化操作高效。
内容的提问来源于stack exchange,提问作者user9371527
相关产品推荐
相关产品推荐

