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

基于汉明距离删除DataFrame行时报IndexError的问题排查求助

错误根因

你的代码核心问题是编码后的矩阵X和实际操作的df没有同步更新,二者的长度、索引对应关系在第一次删除行之后就完全错位,最终引发索引越界。

具体问题拆解

  • 你在最开始就用原始全量df生成了固定长度的X矩阵,但是循环过程中一直在删除df的行,df的长度持续变短,但X始终是初始的全量长度,你用len(X)计算得到的idx自然会超过当前df的最大有效索引。
  • 你从dists中拿到的索引i是原始X矩阵中前idx行的位置索引,和删除过行的当前df的索引完全不匹配,直接用这个i去删df的行,必然会出现索引超出范围的问题。
  • 循环的遍历范围是按照初始X的长度定义的,后续df已经变短,循环次数还是初始的全量次数,也会触发越界。

修正后代码

你可以调整逻辑,每次删除行之后同步更新X矩阵,同时直接基于当前X的长度做循环判断:

from sklearn.preprocessing import OrdinalEncoder
import pandas as pd
import numpy as np

# 假设df是你的原始数据集
threshold = 1

# 第一次编码
enc = OrdinalEncoder()
X = enc.fit_transform(df.to_numpy())

j = 0
# 动态判断循环终止条件,不要用固定长度的range
while j < len(X) - 1:
    idx = len(X) - j - 1
    row = X[idx]
    prev_rows = X[0:idx]
    dists = np.sum(row != prev_rows, axis=1)
    # 找到所有符合阈值的待删除索引(对应当前X和df的索引)
    dupe_idx = np.where(dists <= threshold)[0].tolist()
    if dupe_idx:
        # 同时删除df和X中对应的行,保证二者索引始终对齐
        df = df.drop(df.index[dupe_idx])
        X = np.delete(X, dupe_idx, axis=0)
        # 删除行后不需要递增j,下一轮的idx会自动对齐新的长度
        continue
    j += 1

print(df)

代码说明

  • 把固定次数的for循环换成动态判断长度的while循环,避免循环次数和实际数据长度不匹配的问题
  • 每次删除df的行之后,同步删除X中对应位置的行,保证二者的长度、索引始终完全对应
  • 用np.where直接批量筛选待删除的索引,不需要额外写遍历,运行效率更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:18:01