我有一系列数字:
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/