panda

2017-11-08 108 views
7

Ben int spanda

a = np.array([1,2,3,5,7,10,13,16,20]) 
pd.Series(a) 

0 1 
1 2 
2 3 
3 5 
4 7 
5 10 
6 13 
7 16 
8 20 

artık gruba serisini küme istediğiniz her grup oluşan bir pandasSeries iki komşu değeri arasındaki farklar <= mesafesidir. mesafesi 1 olarak tanımlanır Örneğin, biz mesafe 2 olup olmadığını,

[1,2,3,5,7], [10], [13], [16], [20] 

sahip mesafe 3 olup olmadığını,

[1,2,3,5,7,10,13,16], [20] 

sahip

[1,2,3], [5], [7], [10], [13], [16], [20] 

sahip pandas/numpy kullanarak nasıl yapılır? Ben, bir başlangıç ​​yapmak zip kullanarak endeks durdurmak ve daha sonra dilimleme öneririz olur, performans için

def splitme(a,d) : 
    return list(map(list,np.split(a,np.flatnonzero(np.diff(a)>d)+1))) 

- listelerin bir fonksiyonu çıkışına listesi olarak

np.split(a,np.flatnonzero(np.diff(a)>d)+1) 

-

cevap

7

İşte bir yaklaşım böylece

adresinde meydana gelebilecek sorunların ortaya çıkmasını engelleyen

Çıktının bir dizi listesi olması gerekiyorsa, liste dönüştürmeyi .tolist/map(list,) ile atlayın.

Numune seferleri -

In [122]: a = np.array([1,2,3,5,7,10,13,16,20]) 

In [123]: splitme(a,1) 
Out[123]: [[1, 2, 3], [5], [7], [10], [13], [16], [20]] 

In [124]: splitme(a,2) 
Out[124]: [[1, 2, 3, 5, 7], [10], [13], [16], [20]] 

In [125]: splitme(a,3) 
Out[125]: [[1, 2, 3, 5, 7, 10, 13, 16], [20]] 

Süre testi -

In [180]: a = np.sort(np.random.randint(1,10000*2,(10000))) 

In [181]: s = pd.Series(a) 

In [182]: d = 3 

In [183]: %timeit pandas_way(s,d) #@cᴏʟᴅsᴘᴇᴇᴅ's soln 
10 loops, best of 3: 55.1 ms per loop 

In [184]: %timeit np.split(a,np.flatnonzero(np.diff(a)>d)+1) 
    ...: %timeit splitme(a,d) 
    ...: %timeit splitme_zip(a,d) 
1000 loops, best of 3: 1.47 ms per loop 
100 loops, best of 3: 2.87 ms per loop 
1000 loops, best of 3: 516 µs per loop 

In [185]: a 
Out[185]: array([ 2,  2,  2, ..., 19992, 19996, 19999]) 
2

Bu groupby kullanarak, pandas yoludur.

n = 1 

s 

0  1 
1  2 
2  3 
3  5 
4  7 
5 10 
6 13 
7 16 
8 20 
dtype: int64 

m = ~s.diff().fillna(0).le(n) 
v = s.groupby(m.cumsum()).apply(lambda x: x.tolist()).tolist() 

v 
[[1, 2, 3], [5], [7], [10], [13], [16], [20]] 
İlgili konular