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

for循环中if条件导致Pandas DataFrame更新异常及仅最后一次生效问题

问题原因分析与修复方案

一、if语句导致无数据写入的核心原因

你写的if email != 'nan'判断逻辑完全错误:
Pandas读取CSV时,空值会被解析为浮点型的NaN,不是字符串'nan'。用字符串做比较时:

  • 当email是有效值时,判断为True,能进入分支;
  • 当email是NaN时,NaN != 'nan'的结果是False,但你的else分支只处理email == 'nan'的情况,导致空值场景既不进if也不触发else,直接跳过。
    更糟的是,如果read.csv里的空值是NaN,你误以为进入if分支时,实际传入的email是NaN,write_csv里找不到匹配的行,自然没有修改,看起来就像无数据写入。

二、仅最后一次循环数据被更新的原因

每次调用write_csv时,你都重新读取原始的write.csv文件,修改一行后就写入out.csv。这意味着:

  • 前一次循环的修改会被下一次循环重新读入的原始文件覆盖;
  • 只有最后一次循环的修改会保留,因为它基于原始文件修改后,直接覆盖了之前的所有写入结果。

三、修复方案

方案1:高效的矢量化处理(推荐)

直接用Pandas的批量操作替代循环,既解决逻辑错误,又提升效率:

import pandas as pd

def process_emails():
    # 一次性读取两个文件,避免重复IO
    df_read = pd.read_csv('/Users/thavas/Downloads/read.csv')
    df_write = pd.read_csv('/Users/thavas/Downloads/write.csv')
    
    # 提取所有非空的邮箱列表
    valid_emails = df_read[pd.notna(df_read['Email'])]['Email'].tolist()
    
    # 批量匹配并修改目标列
    df_write.loc[df_write['Email 1'].isin(valid_emails), 'Email 2'] = "hello"
    
    # 仅写入一次,避免覆盖
    df_write.to_csv('/Users/thavas/Downloads/out.csv', index=False)
    
    # 输出无邮箱的用户
    no_email_users = df_read[pd.isna(df_read['Email'])]['Contact'].tolist()
    for contact in no_email_users:
        print(f"Users {contact} has no email")

process_emails()

方案2:保留原函数结构的临时修复

如果一定要用循环结构,需要避免重复读取原始文件:

import pandas as pd

def write_csv(email, info, df1):
    # 不再每次读文件,传入已加载的DataFrame
    for index, row in df1.iterrows():
        if row['Email 1'] == email:
            df1.loc[index,'Email 2'] = "hello"
    return df1

def read_csv():
    df = pd.read_csv('/Users/thavas/Downloads/read.csv')
    # 提前读取write.csv,只读一次
    df1 = pd.read_csv('/Users/thavas/Downloads/write.csv')
    
    for index, rows in df.iterrows():
        email = rows['Email']
        # 用Pandas原生方法判断空值
        if pd.notna(email):
            info = rows[8:17]
            df1 = write_csv(email, info, df1)
        else:
            print("Users", rows['Contact'], "has no email")
    
    # 所有循环结束后统一写入
    df1.to_csv('/Users/thavas/Downloads/out.csv', index=False)
            
read_csv()

内容的提问来源于stack exchange,提问作者Thavas Antonio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 08:10:29