Pandas中如何仅对State为California的行映射字典值?
解决仅对指定条件的DataFrame列进行值映射的问题
原始数据
DataFrame:
State City 0 California 1 1 California 2 2 Lousiana 1 3 Virginia 2
映射字典:
dic = {1: 'LA', 2: 'SF'} # 注意:LA和SF需用字符串引号包裹,否则会报未定义错误
需求
仅当State列值为California时,用上述字典对City列做值映射,其他行保留原City值。
原代码问题分析
你之前写的代码:
df['City'] = df['City'].where(df['State']=='California').map(dic)
问题在于df['City'].where(df['State']=='California')会把所有State不等于California的行的City值替换为NaN,后续map操作无法将NaN转换回原始值,最终导致非目标行的City变成NaN。
正确解法
方法1:使用loc定位目标行(推荐,效率高)
通过loc精准定位符合条件的行,仅对这些行的City列执行映射:
df.loc[df['State'] == 'California', 'City'] = df.loc[df['State'] == 'California', 'City'].map(dic)
方法2:使用np.where条件赋值
利用numpy.where实现"条件满足则映射,否则保留原值"的逻辑:
import numpy as np df['City'] = np.where(df['State'] == 'California', df['City'].map(dic), df['City'])
方法3:使用apply逐行处理
适合逻辑复杂的场景,逐行判断并赋值:
df['City'] = df.apply(lambda row: dic[row['City']] if row['State'] == 'California' else row['City'], axis=1)
执行结果
三种方法都能得到预期结果:
State City 0 California LA 1 California SF 2 Lousiana 1 3 Virginia 2
内容的提问来源于stack exchange,提问作者xtc_
相关产品推荐
相关产品推荐

