gpt4 book ai didi

python - 有效检查值是否存在于任何给定范围内

转载 作者:太空狗 更新时间:2023-10-30 02:41:49 28 4
gpt4 key购买 nike

我有两个 pandas DataFrame 对象:

  • A 包含 'start''finish'

  • B 有列 'date'

目标是有效地创建一个 bool 掩码,指示 date 是否在 [start, finish] 间隔内

天真的迭代花费了太多时间,我想有一种方法可以更快地做到这一点

更新:AB不同的行数

更新 2:示例:

A
| start | finish |
|------- |-------- |
| 1 | 3 |
| 50 | 83 |
| 30 | 42 |

B
| date |
|------- |
| 31 |
| 20 |
| 2.5 |
| 84 |
| 1000 |

Output:
| in_interval |
|------- |
| True |
| False |
| True |
| False |
| False |

附言我的数据采用日期时间格式,但我想解决方案与数字的解决方案没有区别

最佳答案

您可以用 O(n) 的复杂度来完成。这个想法是改变表示。在 A 中,每个间隔存储一行。我会建议一个数据框,每个转换存储一行(即进入一个间隔,离开一个间隔)。

A = pd.DataFrame(
data={
'start': [1, 50, 30],
'finish': [3, 83, 42]
}
)

starts = pd.DataFrame(data={'start': 1}, index=A.start.tolist())
finishs = pd.DataFrame(data={'finish': -1}, index=A.finish.tolist())
transitions = pd.merge(starts, finishs, how='outer', left_index=True, right_index=True).fillna(0)
transitions

start finish
1 1 0
3 0 -1
30 1 0
42 0 -1
50 1 0
83 0 -1

此数据框按日期存储转换类型。现在,我们需要知道每个日期是否处于某个时间间隔内。看起来像是在计算左括号和右括号。你可以这样做:

transitions['transition'] = (transitions.pop('finish') + transitions.pop('start')).cumsum()
transitions

transition
1 1
3 0
30 1
42 0
50 1
83 0

这里说:

  • 1 点,我在一个区间
  • 3 岁时,我不是
  • 一般情况下,如果该值严格大于0,则在一个区间内。
  • 请注意,这会处理重叠间隔

现在您与 B 数据框合并:

B = pd.DataFrame(
index=[31, 20, 2.5, 84, 1000]
)

pd.merge(transitions, B, how='outer', left_index=True, right_index=True).fillna(method='ffill').loc[B.index].astype(bool)

transition
31.0 True
20.0 False
2.5 True
84.0 False
1000.0 False

关于python - 有效检查值是否存在于任何给定范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38201057/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com