python - 查找第一个范围包含数字(Numpy、Pandas)

标签 python pandas numpy

我有一系列数字:

arr = np.array([1147.8, 1067.2,  957.6,  826.4])

还有一个 pandas DF,有两列“右”和“左”,描述一个范围,而每个范围都包含在 DF 中的下一个范围中:

     right    left 
0    1090     1159.5
1    1080     1169.5
2    1057.5   1191.99

对于 arr 中的每个数字,我想获取包含它的第一个范围的索引。对于第一个数字 (1147.8),它将是 0,因为它在 (1090, 1159.5) 范围内。对于第二个,它将是 2,因为 (1057.5, 1191.99) 中的 1067.2 但不在 (1080, 1169.5) 中(当然还有之前的其他范围)

我可以迭代 arr 中每个数字的 DF,但我正在寻找一种更聪明的方法。 谢谢

最佳答案

arr 和 df 之间的完全叉积,然后过滤,然后选择第一个范围。对于少量数据来说,这样做是可以的。理想情况下,您可以一次性完成所有 2000 个arrs 的操作。 .merge(df_arr, how='cross') 之后的 DataFrame 约有 200 万行,在这种情况下该方法仍然有效。

df_arr = pd.DataFrame({"arr": arr, 
                       "id_arr": range(len(arr))})

(df.reset_index()
     .merge(df_arr, how='cross')
     .query("right < arr < left")
     .groupby("id_arr")
     .first())

产品:

        index   right     left     arr
id_arr                                
0           0  1090.0  1159.50  1147.8
1           2  1057.5  1191.99  1067.2

其中index是最窄范围的索引。

id_arr 用于分组,以防 arr 中有重复值并且您希望结果中出现重复值。如果这不相关,也可以直接按 arr 进行分组。

关于python - 查找第一个范围包含数字(Numpy、Pandas),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71452428/

相关文章:

python-2.7 - 如何比较使用 scikit-learn 库 load_svmlight_file 存储的 2 个稀疏矩阵?

python - Python 似乎不赞成从不同目录导入的论点是什么?

python 继承函数在 init 期间重写

python - 如何在Python上过滤数据透视表

python-3.x - 如何按列分组并获取另一列的最大值并使用python返回整行

python - 平滑逼近 floor 函数以用于反向传播

python - 通过Python中的唯一值计算数组组的平均值

python - 使用sklearn一键编码后如何给出列名?

python - 山狮更新和善变库python

python - 在多级 DataFrame 上使用 pandas apply 函数