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

标签 python range dataframe multiple-columns

我有一个数据框(df1),其中有一列数字,例如:

  • [[2,7,17​​]]

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

  • p1 [[1,6,11,20]]
  • p2 [[5,10,15,16]]
  • 名称 [['A','B','C','D']]

我需要找到 df1 中的数字所属的范围(A、B、C 或 D)。在此示例中,2 介于 1 和 5 之间,因此将返回“A”,而 7 介于 6 和 10 之间,因此将返回“B”。 11 到 15 之间没有任何内容,因此不会返回“C”,但当 D 处于 16 到 20 之间时,将返回 D。

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

虽然this文章似乎在java中提出了类似的问题,除了this之外,我还没有在python中找到类似的问题。 .

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

最佳答案

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

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)

如果一个数字属于多个类别,则仅返回一个。如果它属于 none,则返回一个空字符串(您可能更愿意返回 None)。

双向范围由逻辑或管理。

“技巧”是使用 bool 数组寻址。 categories 是一个 bool 数组(例如 [True, False, False, False]),其中每个元素当且仅当数据位于相应类别中时才为 True:第一个元素 True 表示它位于类别中A等

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

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

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

关于python: 如果一个数字在某个范围内,则返回该范围对应的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29747505/

相关文章:

c++ - 如何修复 g++ 内存范围重叠?

javascript - Excel 插件 : How to create a range?

scala - 在 Spark 中生成大量随机数据的有效方法

pandas - 如何删除 Dataframe.plot 中的特定图例标签?

python - 如何使 Django 开发服务器公开?基因有可能吗?

python - 如何访问 Django 模板中的用户配置文件?

python - 在Python中将字符串列表转换为整数,跳过屏蔽术语

python - CLI 似乎忽略了我的功能并转到另一个! (Python)

Python 在函数内使用 For 循环

python - 从每组的另一列获取与 idxmax 对应的列值