如何用Python循环实现CSV中符合条件的surp值相减并修复pandas报错
问题修复方案
报错根因&存在的问题列表
- 直接报错原因:筛选条件首项写了
df['surp'],该列是浮点数值,无法和后续布尔类型的条件做&运算,导致类型错误。 - 逻辑错误1:prime_type筛选用了
&(且)运算,不可能存在prime_type同时等于两个不同值的行,需改为|(或)运算,或更简洁的isin()方法。 - 逻辑错误2:循环内直接全列赋值
sub_prime_language,每次循环都会覆盖整列数据,无法对应存储每个i的计算结果。 - 语法错误:
df.['sub_prime_language']多写了多余的.,不符合pandas列索引语法。 - 取值错误:
pr_nl.loc['surp']是行索引取值逻辑,你需要的是取surp列的数值,应改为列索引取值。
修复后代码
import pandas as pd df = pd.read_csv("surprisal.primed_extracted.csv") # 先初始化结果列 df['sub_prime_language'] = None for i in range(60): # 筛选荷兰语组的surp值 pr_nl_surp = df.loc[ (df['prime_type'].isin(['nl_unamb', 'nl_amb'])) & (df['target_nr'] == i) & (df['prime_nr'] == i), 'surp' ] # 筛选英语组的surp值 pr_en_surp = df.loc[ (df['prime_type'].isin(['en_unamb', 'en_amb'])) & (df['target_nr'] == i) & (df['prime_nr'] == i), 'surp' ] # 确认匹配到唯一值再做运算,避免索引错误 if len(pr_nl_surp) == 1 and len(pr_en_surp) == 1: diff = pr_nl_surp.iloc[0] - pr_en_surp.iloc[0] # 赋值给对应行 df.loc[ (df['target_nr'] == i) & (df['prime_nr'] == i), 'sub_prime_language' ] = diff # 可按需导出结果文件 df.to_csv("surprisal_with_diff.csv", index=False)
补充说明
如果你的target_nr和prime_nr列是字符串类型,把条件里的== i改成== str(i)即可适配。
内容的提问来源于stack exchange,提问作者Mijin
相关产品推荐
相关产品推荐

