如何在 Pandas 数据框列中找到与 O(logn) 中输入值 x 最接近的 k 个值?

化学

我有一个包含两列的数据框:1)ID:代表样本 ID 的随机整数,2)A:浮点数

size_df1 = 1000
df1 = pd.DataFrame(np.random.random_sample((size_df1)), columns=list('A'))
df1['ID'] = random.sample(range(0, size_df1), size_df1)

给定像 x=0.21 这样的输入,如何df1['A']在 log(n) 中找到 10 个(或任何其他整数,如 k)最接近x 的值,其中 n 是 df1 中的行数。请注意,这应该在不替换的情况下完成,每次我在 中找到这 10 个最接近的值时df1['A'],我应该删除这些值或以某种方式标记它们而不是将它们用于下一个 x。这可以在logn中解决吗?谢谢

金巴利

您可以使用 轻松找到 k 个最小值.nsmallest(),最接近的值是绝对差值最小的值:

>>> (df1['A'] - 0.21).abs().nsmallest(10)
969    0.000014
889    0.000442
779    0.003299
259    0.003637
843    0.003700
84     0.003818
651    0.004264
403    0.004360
648    0.004421
543    0.005088
Name: A, dtype: float64

如果要访问匹配的行,则可以重用它的索引:

>>> df1.loc[(df1['A'] - 0.21).abs().nsmallest(10).index]
            A   ID
969  0.210014  237
889  0.210442  225
779  0.206701  127
259  0.213637  883
843  0.206300  330
84   0.206182   17
651  0.205736   64
403  0.205640  388
648  0.214421  964
543  0.204912  616

请注意,文档nsmallest说:

对于相对于 Series 对象大小的小 n,比 .sort_values().head(n) 更快。

关于复杂性的话,因为您的值没有排序:

  • 最低限度的复杂性是O(n) 如果你想找到 1 个最接近的值
  • 你可以做一个类似二分搜索的 get O(log(n)),但这需要先排序 - 所以它实际上是O(n log(n)).

假设您的数据框按 A 排序:

>>> df1.sort_values('A', inplace=True)

然后我们可以尝试使用 sorted search 函数,它返回行号(不是索引值):

>>> df1['A'].searchsorted(0.21)
197

这意味着我们可以使用它来找到k最接近的候选者,然后在这个2k数据帧上使用我们之前的方法

def find_closest(df, val, k):
    return df.loc[df['A'].sub(val).abs().nsmallest(k).index]

def find_closest_sorted(df, val, k):
    closest = df1['A'].searchsorted(val)
    return find_closest(df1.iloc[closest - k:closest + k], val, k)
>>> find_closest_sorted(df1, 0.21, 10)
            A   ID
969  0.210014  237
889  0.210442  225
779  0.206701  127
259  0.213637  883
843  0.206300  330
84   0.206182   17
651  0.205736   64
403  0.205640  388
648  0.214421  964
543  0.204912  616

复杂性应该在这里:

  • O(n log(n)) 用于排序(可以在多次查找中摊销)
  • O(log(n)) 用于排序搜索
  • O(k) 最后一步。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在列pandas中找到最接近的值

Python / Pandas在一列中找到最接近/最接近的值

如何在左侧找到最接近的值

如何在熊猫列/系列中找到最接近输入数字的值?

如何在pinescript数组中找到最接近的值?

如何在 Python 中找到最接近数字的值?

如何在大型排序数组中高效找到最接近另一个值X的值

如何在Pandas Dataframe中获取最接近另一个值的值

熊猫在列中找到最接近的值

如何在Spark中找到两个DataFrame的最接近值

如何在同一列中找到最接近的值

在排序列表中找到最接近/最接近的值

如何在R中的向量中找到一个值与其最接近的值之间的差?

如何从POJO属性中找到Java中最接近的值?

如何获取最接近x的列表中的值的索引?

在Pandas DataFrame的不同列中查找最接近的先前值

如何根据最接近的匹配从另一个有效地替换大型数据框(100k +行)中的值?

如何找到一个数据框列的最接近值并返回其他数据框的列值和位置

在python列表中找到最接近的值对

从列表中找到最接近的值?

在Matlab中找到最接近的较小值

python在列表中找到最接近的值

如何在pandas数据框列中找到已知值的索引?

如何在 Pandas 的连接数据框中找到列/行组合的最大值

在分组数据的列中找到最接近的值,然后在 R 中找到它们对应的行

在 Pandas 中寻找最接近的值

如何从谁的值最接近零的列表中找到两个索引

如何在java中找到最接近零的五个输入数字

熊猫在给定值列表的情况下在数据框列中找到最接近值的索引