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

Pandas条件过滤失效:为何仍有负数数据存入Redis?

问题排查:Pandas过滤后Redis仍出现负数数据

1. 过滤逻辑的常见漏洞

  • 未覆盖所有数值列:如果过滤条件只针对部分列(比如df[df['colA'] >=0]),其他列的负数会被遗漏。正确的做法是检查所有数值列是否非负:
    # 先筛选出所有数值类型的列
    numeric_cols = df.select_dtypes(include=['int64', 'float64']).columns
    # 保留所有数值列都非负的行
    refined_feature = df[(df[numeric_cols] >= 0).all(axis=1)]
    negative_feature = df[~(df[numeric_cols] >= 0).all(axis=1)]
    
  • 数据类型错误:如果列是字符串类型(比如存储为"-123"),数值比较会失效。需要先将列转为数值类型:
    df[numeric_cols] = df[numeric_cols].apply(pd.to_numeric, errors='coerce')
    

2. 写入Redis前的验证步骤

在执行hset前,必须确认refined_feature确实没有负数:

# 检查过滤后的数据是否还存在负数行
remaining_neg = refined_feature[(refined_feature[numeric_cols] < 0).any(axis=1)]
print(f"过滤后剩余负数行数: {len(remaining_neg)}")
# 如果行数大于0,打印具体行排查
if len(remaining_neg) > 0:
    print(remaining_neg)

3. Redis写入环节的问题

  • 变量名混淆:确认写入的是refined_feature而非原始数据表,避免出现redis.hset('key', mapping=original_df.to_dict())这类错误。
  • 字典转换异常:使用to_dict()时,如果数据类型有异常(比如numpy数值转成字符串),可能导致Redis存储字符串形式的负数。可以手动转换为Python原生类型:
    row_dict = {k: v.item() if isinstance(v, np.generic) else v for k, v in row.items()}
    redis.hset(f"feature:{idx}", mapping=row_dict)
    

4. 服务器端执行的潜在问题

  • 多进程/线程覆盖:AWS服务器上如果有多个进程同时写入Redis,可能存在过滤后的数据被原始数据覆盖的情况,需要检查任务调度逻辑。
  • 缓存未更新:如果Redis存在缓存机制,可能读取的是旧数据,可尝试手动清空对应key后重新写入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:27:47