使用for循环遍历列表时从CSV提取对应值的实现问题
我来帮你排查下问题,顺便给你几个更高效的解决方案~
你的代码为什么没工作?
in操作符用错了:df.word是pandas的Series对象,直接用w in df.word会检查w是否在Series的索引里(默认是0、1、2...),而不是检查单词是否在列的取值中,所以这个判断永远返回False,累加代码根本没执行。- 就算匹配到,累加的是整列值:就算判断成功,
df.pleasantness是整个列的所有值,不是当前匹配单词对应的单个数值,这样会把所有单词的pleasantness都加一遍,显然不符合需求。 - 可能的大小写/标点问题:比如你的文本文件里的单词是大写(比如"A"),或者带标点(比如"abandon,"),而csv里都是小写无标点的纯单词,这也会导致匹配失败。
方案1:修复你的循环代码
先解决判断和取值的问题,同时优化查找效率:
import pandas as pd # 读取csv字典 df = pd.read_csv("dictionary.csv", sep=',') # 把单词列转成小写集合,加快查找速度,同时统一大小写 word_set = set(df.word.str.lower()) # 建立单词到数值的映射字典,避免每次查找都遍历DataFrame word_values = df.set_index('word')[['pleasantness','activation','imagery']].to_dict('index') # 读取文本并清洗:转小写、去除常见标点 with open(textfile, 'r') as read_file: data = read_file.read().split() data_cleaned = [w.lower().strip('.,!?;:"\'') for w in data] # 初始化统计变量 total_words = 0 total_pleasantness = 0.0 total_activation = 0.0 total_imagery = 0.0 for w in data_cleaned: total_words += 1 if w in word_set: # 从字典中快速取出对应数值 vals = word_values[w] total_pleasantness += vals['pleasantness'] total_activation += vals['activation'] total_imagery += vals['imagery'] print(f"总遍历单词数:{total_words}, 累计pleasantness:{total_pleasantness}, 累计activation:{total_activation}, 累计imagery:{total_imagery}")
方案2:用pandas向量化操作(更高效,推荐)
如果你的data列表很大,循环会很慢,用pandas的内置方法更高效,还能自动处理重复单词的累加:
import pandas as pd # 读取csv字典 df = pd.read_csv("dictionary.csv", sep=',') # 读取文本并清洗 with open(textfile, 'r') as read_file: data = read_file.read().split() data_cleaned = [w.lower().strip('.,!?;:"\'') for w in data] # 统计每个单词的出现次数 word_counts = pd.Series(data_cleaned).value_counts().reset_index() word_counts.columns = ['word', 'occurrences'] # 和字典表合并,只保留字典中存在的单词 merged_df = pd.merge(word_counts, df, on='word', how='inner') # 计算累计值:出现次数 × 对应数值 merged_df['total_pleasantness'] = merged_df['occurrences'] * merged_df['pleasantness'] merged_df['total_activation'] = merged_df['occurrences'] * merged_df['activation'] merged_df['total_imagery'] = merged_df['occurrences'] * merged_df['imagery'] # 汇总结果 total_words = len(data_cleaned) total_p = merged_df['total_pleasantness'].sum() total_a = merged_df['total_activation'].sum() total_i = merged_df['total_imagery'].sum() print(f"总遍历单词数:{total_words}, 累计pleasantness:{total_p}, 累计activation:{total_a}, 累计imagery:{total_i}")
额外提示
- 如果你不确定文本里的单词是否有标点,一定要做清洗处理,否则会出现明明单词存在但匹配不到的情况。
- 如果csv里有重复的单词,方案2会自动合并同一单词的次数,比循环更准确。
- 方案2的效率远高于循环,尤其是当
data列表包含上万甚至更多单词时,差距会非常明显。
内容的提问来源于stack exchange,提问作者Fillask
相关产品推荐
相关产品推荐

