Pandas中Series列赋值不生效及多结果匹配问题求助
咱们先逐个拆解解决你的问题哈:
第一个问题:COD_OF列没变化的原因
你代码里犯了一个很容易踩的小坑——把赋值运算符写成了比较运算符:
df_control.at[idx,'COD_OF'] == 'eee' # 这是判断相等,不是赋值!
这里的==是用来做相等判断的,只会返回True/False,根本不会修改DataFrame里的值。改成单等号=就可以正常赋值了:
df_control.at[idx,'COD_OF'] = 'eee'
另外补充一点:用iterrows()循环遍历DataFrame的效率非常低,尤其是数据量大的时候,推荐用Pandas的矢量化操作来替代,既简洁又高效,比如:
import numpy as np # 用np.where实现多条件赋值 df_control['COD_OF'] = np.where( df_control['APPOINTMENT'].str.contains('VAP'), 'eee', np.where( df_control['APPOINTMENT'].str.contains('SVE'), 'AA', df_control['COD_OF'] # 不匹配时保留原数值 ) )
第二个问题:匹配时得到多个结果的原因
你的匹配代码出现多结果,问题出在匹配环节:
cod_sup['COD_OF'][cod_sup['RUT_EMISOR'] == df_control.at[idx,'RUT_EMISOR']]
如果cod_sup里存在多个相同的RUT_EMISOR值,这个布尔索引就会返回多行数据,后续的to_string()会把这些行的COD_OF值拼接成一个字符串,所以你会看到多个结果。
解决方法分两种场景:
如果业务逻辑是取第一个匹配的结果:
可以手动判断匹配结果是否为空,然后取第一个元素:match_result = cod_sup[cod_sup['RUT_EMISOR'] == df_control.at[idx,'RUT_EMISOR']]['COD_OF'] if not match_result.empty: df_control.at[idx,'COD_OF'] = match_result.iloc[0].strip() else: # 处理无匹配的情况,比如设为默认值或NaN df_control.at[idx,'COD_OF'] = np.nan更高效的批量匹配(推荐):
完全没必要用循环逐个匹配,用Pandas的merge功能可以批量完成,还能避免循环的低效问题:# 先给cod_sup去重,确保每个RUT_EMISOR只保留一个结果(keep='first'表示取第一个,可按需调整) cod_sup_unique = cod_sup.drop_duplicates(subset='RUT_EMISOR', keep='first') # 合并两个DataFrame,匹配RUT_EMISOR对应的COD_OF df_control = df_control.merge( cod_sup_unique[['RUT_EMISOR', 'COD_OF']], on='RUT_EMISOR', how='left', suffixes=('', '_new') ) # 用新匹配到的值替换原COD_OF,无匹配的保留原值 df_control['COD_OF'] = df_control['COD_OF_new'].fillna(df_control['COD_OF']) # 删除临时生成的列 df_control.drop('COD_OF_new', axis=1, inplace=True)
内容的提问来源于stack exchange,提问作者salem1992
相关产品推荐
相关产品推荐

