我已经看到:
- how do I find the closest value to a given number in an array?
- How do I find the closest array element to an arbitrary (non-member) number?.
这些与香草蟒有关,而不是Pandas。
如果我有这个系列:
ix num
0 1
1 6
2 4
3 5
4 2
我输入3,我如何(有效地)找到?
1.索引3(如果在序列中找到)
1.小于和大于3的值的索引(如果在序列中找不到)。
也就是说,使用上面的序列{1,6,4,5,2},输入3,我应该得到索引为(2,4)的值(4,2)。
9条答案
按热度按时间vvppvyoh1#
您可以像这样使用
argsort()
比如说
input = 3
df_sort
是具有2个最接近值的 Dataframe 。对于索引,
对于值,
详细信息,对于上述解决方案,
df
为5kgi1eie2#
除了不能完全回答这个问题之外,这里讨论的其他算法还有一个额外的缺点,那就是它们必须对整个列表进行排序,这导致了**~N log(N)的复杂度。
然而,在~N**中也可能达到相同的结果。这种方法将 Dataframe 分成两个子集,一个小于所需值,一个大于所需值。较低的相邻 Dataframe 比较小 Dataframe 中的最大值大,而较高的相邻 Dataframe 则相反。
这将给出以下代码片段:
这种方法类似于使用partition in pandas,当处理大型数据集且复杂性成为问题时,partition in pandas非常有用。
比较这两种策略可以看出,对于大N,分区策略确实更快。对于小N,排序策略将更有效,因为它是在更低的级别实现的。它还是一行程序,这可能会提高代码可读性。x1c 0d1x
复制此图的代码如下所示:
mzsu5hc03#
我建议除了JohnGalt的答案之外,还使用
iloc
,因为.ix首先查看索引标签,所以即使是未排序的整数索引也可以使用iloc
ymdaylpp4#
如果序列已经排序,查找索引的有效方法是使用bisect函数。示例:
df
的列col
被排序。val
在列中,则bisect_left
将返回列表中值的精确索引,bisect_right
将返回下一个位置的索引。bisect_left
和bisect_right
将返回相同的索引:要插入值以保持列表排序的位置。因此,为了回答这个问题,下面的代码给出了
val
在col
中的索引(如果找到的话),以及最接近的值的索引(否则)。x一个一个一个一个x一个一个二个x
二分算法在查找 Dataframe 列"col"中特定值"val"的索引或其最近邻居时非常有效,但它需要对列表进行排序。
wswtfjt75#
如果您的序列已经排序,您可以使用类似下面的代码。
jhiyze9q6#
可以使用
numpy.searchsorted
。如果搜索列尚未排序,则可以创建一个已排序的DataFrame,并使用pandas.argsort
记住它们之间的Map。(如果计划多次查找最接近的值,则此方法优于上述方法。)排序后,找到与输入最接近的值,如下所示:
cngwdvgl7#
我发现解决这类问题最直观的方法是使用@ivo-merchiers建议的划分方法,但使用nminimum和nlargest。除了处理未排序的序列外,这种方法的一个好处是,通过将k_matches设置为大于1的数字,可以轻松获得几个接近的值。
输出:
j8yoct9x8#
如果您需要在
'num'
列中找到与obj_num
最接近的值,并且在有多个选择的情况下,您可以基于'num'
以外的其他列的值来选择最佳出现,例如第二列'num2'
。为此,我建议创建一个新列
'num_diff'
,然后使用sort_values
。我们希望在'num'
列中选择最接近3
的值,如果出现次数较多,则在'num2'
列中选择最小值,代码如下:下面的函数使用目标值和列的dict来完成这项工作(它考虑用于排序的列的顺序):
dced5bon9#
这里有很多答案,很多都很不错。没有一个答案被接受,@Zero的答案是目前评分最高的。另一个答案指出,当索引还没有排序时,它不起作用,但他/她推荐了一个看起来不赞成的解决方案。
我发现可以按以下方式对值本身使用numpy版本的
argsort()
,即使索引没有排序也能正常工作:请看Zero的回答。