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

如何循环处理DataFrame行并避免写入CSV时覆盖原有值?

解决DataFrame遍历后写入CSV时结果被最后一行覆盖的问题

嘿,我完全懂你遇到的糟心问题——遍历每行做情感分析后,所有行的结果居然都被最后一行给覆盖了!这其实是代码里两个关键逻辑错误导致的,咱们一步步捋清楚:

问题根源

  1. 整列赋值而非单行修改:你写的 data['Score']=sentiment 会把整个Score列的所有行都设置成当前循环行的情感分值,同理data['Sentiment']='Neutral'也是直接修改整列。循环到最后一行时,所有行自然都会被改成最后一行的结果。
  2. 循环内重复写入CSV:每次循环都调用to_csv,一会儿追加一会儿覆盖,不仅会让文件内容混乱,还会因为整列已经被修改,每次写入的都是当前整列的状态,最后全是最后一行的值。

修复后的代码

from textblob import TextBlob
import pandas as pd

# 读取数据:如果原HR.csv只有评论列,names只保留'Comments'更合理,避免列名混乱
read = pd.read_csv('HR.csv', delimiter=',', skip_blank_lines=False, skiprows=1, names=['Comments'])
data = pd.DataFrame(read)

# 先初始化Score和Sentiment列,避免后续赋值报错
data['Score'] = 0.0
data['Sentiment'] = ''

# 用iterrows遍历,同时获取行索引和行数据
for idx, row in data.iterrows():
    # 只提取当前行的评论文本做分析,别把整行转成字符串(原代码会把索引、列名都混进去)
    comment_text = row['Comments']
    obj = TextBlob(comment_text)
    sentiment_score = obj.sentiment.polarity
    
    # 精准修改当前行的对应列,而不是整列覆盖
    data.loc[idx, 'Score'] = sentiment_score
    if sentiment_score == 0:
        data.loc[idx, 'Sentiment'] = 'Neutral'
    elif sentiment_score > 0:
        data.loc[idx, 'Sentiment'] = 'Positive'
    else:
        data.loc[idx, 'Sentiment'] = 'Negative'

# 所有行处理完成后,一次性写入CSV,避免重复写入的混乱
data.to_csv('HR12.csv', index=False)

关键改进点

  • 用iterrows()拿到行索引idx,通过data.loc[idx, 列名]只修改当前行的数值,再也不会整列被覆盖。
  • 把to_csv移到循环外面,所有行处理完再一次性写入,既高效又不会出现内容混乱。
  • 只提取每行的Comments文本做情感分析,原代码里把整行转成字符串的操作会把索引、列名等无关内容混进去,导致分析结果不准确。

这样修改后,你的CSV文件就会每行对应各自的情感分析结果,再也不会出现全是最后一行值的问题啦!

内容的提问来源于stack exchange,提问作者hadeel FI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:17:37