如何基于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
相关产品推荐
相关产品推荐

