python:如果一个数字落在某个范围内,return该范围对应的字符串

python: if a number falls within a certain range, return the string corresponding to that range

我有一个带有一列数字的数据框 (df1),比如说:

和另一个带有范围列表的数据框 (df2),由两列定义 - 开始位置 (p1) 和结束位置 (p2)。此数据框中的每个范围在同一行的另一列中都有对应的字符串(名称),例如:

我需要找到 df1 中的数字所在的范围(A、B、C 或 D)。在此示例中,2 介于 1 和 5 之间,return 'A' 也是如此,而 7 介于 6 和 10 之间,因此 return 'B' 也是如此。没有东西落在 11 和 15 之间,所以 'C' 不会被 returned,但是 D 会被 returned,因为它落在 16 和 20 之间。

注意:虽然A和B都是在比起始位置高的位置结束(p1低于p2),但是D在比结束位置高的位置开始(p2低于p1)。我仍然想将 df1 中的 17 称为落在范围 D 内,即使范围是相反的。

虽然this article seems to be asking a similar question in java, I have not found anything similar in python, other than this.

提前谢谢你,请记住我是个新手!

这是包含一些想法的草稿。我使用麻木。我使用了数组,但您可以使用问题中指定的列。

import numpy as np

df1 = np.array([2,7,17,0])
p1 = np.array([1,6,11,20])
p2 = np.array([5,10,15,16])
name = np.array(['A','B','C','D'])

result = []

for d in df1:

    categories = np.logical_or(
        np.logical_and(d >= p1, d <= p2),
        np.logical_and(d <= p1, d >= p2))

    result.append(name[categories[0]] if np.any(categories) else '')

print(result)

如果一个数字属于多个类别,则只有一个被 return 编辑。如果它落入 none,则为空字符串 return(您可能更喜欢 return None)。

双向范围由 logical_or 管理。

"trick"是使用布尔数组寻址。 categories 是一个布尔数组(例如 [True, False, False, False]),其中当且仅当数据属于相应类别时每个元素为 True:第一个元素 True 表示它属于类别 A,等等.

name[categories] 是一个包含 name 的所有元素的数组,categories 中对应的元素为 True。其他元素被剥离。

例如np.array([1,2,3])[np.array([True, False, True])] -> array([1,3])

name[categories[0]]是号码所属的第一个(可能有几个)类别。