DataFrame预处理函数未生效且报KeyError:movement,求问题排查
预处理DataFrame函数无效果且报KeyError问题排查
一、KeyError: 'movement' 的直接原因
你创建DataFrame时指定的列名是**"Movement"**(首字母大写),但调用replace_large_difference函数时传的参数是小写的'movement'——pandas的列名是大小写敏感的,所以找不到对应列,直接抛出KeyError。
二、函数无修改效果的核心问题
1. Movement列是字符串类型
读取数据时,line.split()得到的movement是字符串,存入DataFrame后该列仍为字符串类型。执行curr_value - prev_value时会直接报错(这个错误被前面的KeyError掩盖了),根本没法计算差值,自然不会有任何修改。
2. 差值判断逻辑不符合需求
你的目标是把70之后的20修正为70,但当前代码判断的是diff > 8(即当前值比前一个值大8以上)。而70到20的差值是20-70=-50,完全不满足>8的条件,所以不会触发替换。需要改成判断差值的绝对值大于8,或者针对下跌场景判断curr_value < prev_value - 8。
三、修正后的完整代码
import pandas as pd from datetime import datetime data = [] with open("bird_jan25jan16.txt") as f: for line in f: try: date_str, time, movement = line.split() dt_str = date_str + ' ' + time dt = datetime.strptime(dt_str, "%Y-%m-%d %H:%M:%S.%f") # 读取时直接转成数值类型,避免后续计算报错 data.append([dt, float(movement)]) except ValueError: print(f"Ignoring line: {line}") # 列名保持首字母大写,和后续调用一致 df = pd.DataFrame(data, columns=["Datetime", "Movement"]) print(df) # 修正后的预处理函数 def replace_large_difference(df, col_name): # 二次确保列是数值类型,防止意外 df[col_name] = pd.to_numeric(df[col_name], errors='coerce') prev_value = df[col_name].iloc[0] for index, curr_value in enumerate(df[col_name]): # 计算绝对值差值,覆盖涨跌两种异常情况 diff = abs(curr_value - prev_value) if diff > 8: df.loc[index, col_name] = prev_value else: prev_value = curr_value return df # 传入正确的列名"Movement" df_fixed = replace_large_difference(df, 'Movement') print(df_fixed) print(df_fixed.iloc[[1745]])
关键修改说明
- 读取数据时将
movement转为float,确保列是可计算的数值类型 - 函数调用时传入正确的列名
'Movement',解决KeyError问题 - 将差值判断改为绝对值对比,这样不管是突然上涨还是下跌超过阈值,都会触发替换(如果只需要处理下跌场景,把
diff >8改成curr_value < prev_value -8即可) - 函数内增加
pd.to_numeric二次校验,避免因数据异常导致类型问题
内容的提问来源于stack exchange,提问作者linnsans
相关产品推荐
相关产品推荐

