如何用np.where()为Pandas数据集添加二级ID且避免覆盖?
问题分析
你的核心问题是每次调用np.where()直接赋值给df['Add']时,会用新生成的数组完全覆盖整列数据,之前赋值的内容会被全部替换,最终只有最后一次np.where()的结果生效。
而你尝试的str.contains('')逻辑错误:str.contains('')对所有非空字符串都会返回True,再和'1'/'2'等字符串比较时,布尔值与字符串的比较结果永远为False,所以所有行都触发默认的空字符串,导致全列为空。
解决方法
方法1:在np.where中保留原有值,仅修改空单元格
每次调用np.where时,将第三个参数设为当前的df['Add'],同时加入“当前Add为空”的条件,这样只会修改符合匹配条件且未被赋值过的单元格:
import pandas as pd import numpy as np df = pd.DataFrame({'Example':['1','2','3','4']}) df['Add'] = '' # 仅在匹配Example值且Add为空时替换,否则保留原有值 df['Add'] = np.where((df['Example'] == '1') & (df['Add'] == ''), 'One', df['Add']) df['Add'] = np.where((df['Example'] == '2') & (df['Add'] == ''), 'Two', df['Add']) df['Add'] = np.where((df['Example'] == '3') & (df['Add'] == ''), 'Three', df['Add']) df['Add'] = np.where((df['Example'] == '4') & (df['Add'] == ''), 'Four', df['Add']) print(df.head())
输出:
Example Add 0 1 One 1 2 Two 2 3 Three 3 4 Four
方法2:用字典映射(更简洁高效)
如果是批量的一对一映射,直接用map方法比多次np.where更高效简洁,适合大量映射场景:
import pandas as pd df = pd.DataFrame({'Example':['1','2','3','4']}) # 定义ID映射字典 id_mapping = {'1': 'One', '2': 'Two', '3': 'Three', '4': 'Four'} # 映射后填充未匹配到的空值 df['Add'] = df['Example'].map(id_mapping).fillna('') print(df.head())
输出与方法1一致,代码更易维护。
内容的提问来源于stack exchange,提问作者John Conor
相关产品推荐
相关产品推荐

