2016-03-03 80 views
3

鑑於某些數據的下列位:大熊貓DataFrame.groupby的公差

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

您首先需要垃圾箱。否則,你如何區分下一行的10.10 +/- 0.25和10.02 +/- 0.25? – Alexander

+0

當使用pd.cut時,結果總是互斥的,因爲一個值只能存在於binA或binB中,但從來不會同時存在binA和binB? – destructo

+0

我同意@Alexander。爲了獲得對數據的「感覺」,我會用直方圖將它們繪製出來,其中二進制大小是您的測量分辨率(0.01)。您將快速直觀地瞭解您的實際數據。如果您擔心速度問題,並且您確實擁有大量數據,那麼我會將它們放入數據庫中,快速進行比較以解決其他人的問題。 – roadrunner66

回答

0

我建議在PyPI上使用intervaltree包,而不是熊貓/ 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']} 

這不是很在您指定的格式,但它應該是足夠直截了當做出你所需要的格式的任何變化。