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

如何基于numpy的where返回结果删除dataframe中的指定行

解决方案

你需要先把np.where返回的二维索引数组展平为一维序列,就可以直接传入df.drop()删除对应行。

核心转换步骤

  • 针对你给出的array([[1, 2, 3, 4]], dtype=int32)格式的返回值,调用.flatten()方法即可完成转换:
import numpy as np

# 你拿到的原始索引数组
raw_idx = np.array([[1, 2, 3, 4]], dtype=int32)
# 转成df.drop可直接识别的一维索引序列
drop_idx = raw_idx.flatten()
# 执行删除
df = df.drop(drop_idx, axis=0)
  • 如果你是直接取np.where的返回值,注意np.where返回的是元组,取第一个元素即可得到索引数组:
a = np.where(dists <= threshold)
drop_idx = a[0].flatten()
df = df.drop(drop_idx, axis=0)

现有示例代码优化

你当前的代码存在冗余操作:每次删除行后不需要重新调用enc.fit_transform(),重复拟合编码器会改变编码值,导致汉明距离计算逻辑出错,只需要在最开始做一次编码,删除行时同步删除编码数组的对应行即可,优化后代码如下:

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

data = [[1,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,1,1,1,1,2], [1,1,1,1,1,1,1,1,1,1,1,1,3]]
df = pd.DataFrame(data, columns=['csk_1', 'csk_2', 'csk_3', 'csk_4', 'csk_5', 'csk_6', 'csk_7', 'csk_8', 'csk_9', 'csk_10', 'csk_11', 'csk_12', 'csk_13'])

enc = OrdinalEncoder()
# 仅执行一次编码
X = enc.fit_transform(df.to_numpy())
j = 0
totals = (len(X) - 1)
threshold = 1

while j < totals:
    # 数据量小于2时无需继续计算
    if len(X) <= 1:
        break
    idx = len(X) - j - 1
    row = X[idx]
    prev_rows = X[0:idx]
    dists = np.sum(row != prev_rows, axis=1)
    a = np.where(dists <= threshold)
    drop_idx = a[0].flatten()
    # 同步删除原数据表和编码数组的对应行
    df = df.drop(drop_idx, axis=0)
    X = np.delete(X, drop_idx, axis=0)
    j = j + 1
print(df)

运行上述代码会输出汉明距离大于阈值的唯一保留行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:06:03