pandas DataFrame.groupby具有容差

时间:2016-03-03 18:47:24

标签: python numpy pandas

鉴于以下一些数据:

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解决方案?

1 个答案:

答案 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']}

它并不完全符合您指定的格式,但它应该足够简单,可以对您需要的格式进行任何更改。