鉴于以下一些数据:
data = {'Object': ['objA', 'objB', 'objC', 'objD', 'objE'],
'Length': [10.1, 10.02, 7.4, 6.24, 5.99]}
df = pd.DataFrame(data)
df
这导致以下数据帧:
Out[6]:
Length Object
0 10.10 objA
1 10.02 objB
2 7.40 objC
3 6.24 objD
4 5.99 objE
我想将“长度”分组。列基于+ - 容差。这样做会给我以下组。像下面的伪代码:
tolerance = .25
grouped = df.groupby(df['Length'] +- tolerance)
这将导致与下面的分组类似的分组:
{(10.10+-.25): [0L, 1L],
(7.40+-.25): [2L],
(6.24+-.25): [3L, 4L]}
环顾四周,人们建议使用 pd.cut 和预定义分档,但是,考虑到我的数据集的真实大小和长度的可变性,预先计算bin范围似乎是一点暴力解决方案。有没有人有更优雅/快速/熊猫/ numpy-esque解决方案?
答案 0 :(得分:0)
我建议在PyPI上使用intervaltree
包,而不是使用pandas / numpy-esque解决方案。
这个想法是将每个长度+/-容差区间添加到区间树中,使区间映射到关联对象。然后,遍历长度并查询间隔树。这将为您提供具有包含查询长度的容差间隔的所有对象。
from intervaltree import IntervalTree
t = IntervalTree()
for length, obj in zip(data['Length'], data['Object']):
t[length-tolerance:length+tolerance] = obj
result = {}
for length in data['Length']:
objs = [iv.data for iv in t[length]]
result[length] = objs
result
字典如下:
{10.1: ['objA', 'objB'], 5.99: ['objD', 'objE'], 10.02: ['objA', 'objB'], 6.24: ['objD'], 7.4: ['objC']}
它并不完全符合您指定的格式,但它应该足够简单,可以对您需要的格式进行任何更改。