You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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值拼接成一个字符串,所以你会看到多个结果。

解决方法分两种场景:

  1. 如果业务逻辑是取第一个匹配的结果:
    可以手动判断匹配结果是否为空,然后取第一个元素:

    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
    
  2. 更高效的批量匹配(推荐):
    完全没必要用循环逐个匹配,用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:34:52