假设我有以下范围列表,所有这些范围都关闭在同一侧,存储为pandas.Interval
对象
[[0, 5), [5, 10), [15, 20), [18, 24)]
假设列表已经排序(或已经来自pandas.arrays.IntervalArray
对象),如何生成组成间隔为
[[0, 10), [15, 24)]
也就是说,repr
of IntervalArray
应该打印
<IntervalArray>
[[0, 10), [15, 24)]
Length: 2, closed: left, dtype: interval[int64]
而不是
<IntervalArray>
[[0, 5), [5, 10), [15, 20), [18, 24))]
Length: 4, closed: left, dtype: interval[int64]
当然,我可以手动比较每个间隔,然后创建新的Interval
对象。目前我正在使用more_itertools.split_when
intervals: List[Interval]
# Split `intervals` into groups whenever a pair of Intervals are disjoint
>>> map(IntervalArray, split_when(intervals, lambda x, y: not x.overlaps(y)))
这种方法的注意事项如下:
IntervalArray
列表,而不是一个IntervalArray
列表(不幸的是,您不能直接从IntervalArray
的列表创建一个IntervalArray
)*[0, 5), [5, 0)
,即使它们在联合时是连续的。我想知道是否有使用pandas
函数(如pandas.aggregate
)来实现此操作的方法。
我知道,当使用IntervalArray
作为索引或用于重叠检查时,这两个版本的功能将完全相同。但是,最后,我希望使用表示间隔的左边和右侧的两个INTEGER
列将INTEGER
持久化到数据库中,而一个IntervalArray
的子间隔被联合起来将产生更少的对,所需的行也要少得多。
*我的意思是,如果我真的想沿着一条条路线走下去,我可以写:
IntervalArray([*map(lambda ia: Interval(ia.left[0], ia.right[-1], closed=ia.closed), map(IntervalArray, split_when(intervals, lambda x, y: not x.overlaps(y))))])
但是在pandas
中是否有类似的方法使用工具?
发布于 2021-10-10 21:44:44
您可以使用一个名为皮索的新python包,它是为熊猫设计的。用pip或conda安装。然后用你的例子
import piso
piso.register_accessors() # needed if using piso accessor
intervals = pd.arrays.IntervalArray.from_tuples(
[(0, 5), (5, 10), (15, 20), (18, 24)],
closed = "left",
)
result = intervals.piso.union() # using accessor
# this works too
# result = piso.union(intervals)
结果是:
<IntervalArray>
[[0, 10), [15, 24)]
Length: 2, closed: left, dtype: interval[int64]
Piso还将与其他设置操作一起工作,如交叉、差异和其他操作。它也支持pandas.Timestamp
和pandas.Timedelta
值的间隔。
注意到:我是piso的创建者。如果您有任何反馈或问题,请随时与您联系。
https://stackoverflow.com/questions/65863958
复制相似问题