如何循环处理DataFrame行并避免写入CSV时覆盖原有值?
解决DataFrame遍历后写入CSV时结果被最后一行覆盖的问题
嘿,我完全懂你遇到的糟心问题——遍历每行做情感分析后,所有行的结果居然都被最后一行给覆盖了!这其实是代码里两个关键逻辑错误导致的,咱们一步步捋清楚:
问题根源
- 整列赋值而非单行修改:你写的
data['Score']=sentiment会把整个Score列的所有行都设置成当前循环行的情感分值,同理data['Sentiment']='Neutral'也是直接修改整列。循环到最后一行时,所有行自然都会被改成最后一行的结果。 - 循环内重复写入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
相关产品推荐
相关产品推荐

