我有一个数据框(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]
是一个数组,其中包含 name
中 categories
中对应元素为 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/