2014-09-12 40 views
7

Her bir satırı, milyonlarca satır ve yaklaşık yüz sütun içeren bir veri çerçevesine ayırmanın en hızlı yolunu bulmalıyım.Her bir satırı pandalar veri kümesinde sıralamak için en hızlı yol

Yani böyle bir şey:

A B C D 
3 4 8 1 
9 2 7 2 

olmayı İhtiyaçları:

A B C D 
8 4 3 1 
9 7 2 2 

Şu anda her bir satıra tür uygulayarak ve aralıksız yeni dataframe Sıra sıra inşa ediyorum. Ayrıca her sıra için birkaç ekstra, daha az önemli şeyler yapıyorum (bu yüzden pandaları kullanıyorum ve uyuşmuyor). Bunun yerine bir liste listesi oluşturmak ve yeni veri çerçevesini bir kerede oluşturmak daha hızlı olabilir mi? Yoksa Cython'a gitmem mi gerek?

+0

Ondan mı, sırayla mı, geri mi? –

+0

Transpozisyon nasıl sıralamayı daha hızlı yapar? – Luke

+0

Eşlemenin "görünümünü" değiştirdiniz ... böylece sıralamayı yapmaya devam etmelisiniz, ancak 1x100'ü 100x1m'ye aynı boşlukta çevirin, sıralayın, sonra tersine çevirin, sadece farklı görünümünüz var. geri dön –

cevap

10

ben Numpy bunu düşünüyorum:

In [11]: a = df.values 

In [12]: a.sort(axis=1) # no ascending argument 

In [13]: a = a[:, ::-1] # so reverse 

In [14]: a 
Out[14]: 
array([[8, 4, 3, 1], 
     [9, 7, 2, 2]]) 

In [15]: pd.DataFrame(a, df.index, df.columns) 
Out[15]: 
    A B C D 
0 8 4 3 1 
1 9 7 2 2 

Ben bu işe yarayabilecek düşünmüştü ama sütunlarını sıralar:

In [21]: df.sort(axis=1, ascending=False) 
Out[21]: 
    D C B A 
0 1 8 4 3 
1 2 7 2 9 

Ah pandalar yükseltir:

In [22]: df.sort(df.columns, axis=1, ascending=False) 
ValueError: When sorting by column, axis must be 0 (rows) 
4

@A tarafından verilen yanıta eklemek için ndy-Hayden, bunu tüm çerçeveye yapabilmek için ... bunun neden işe yarayacağını kesin olarak bilmiyoruz. Sipariş üzerinde kontrol yok gibi görünüyor.

In [97]: A = pd.DataFrame(np.random.randint(0,100,(4,5)), columns=['one','two','three','four','five']) 

    In [98]: A 
    Out[98]: 
    one two three four five 
    0 22 63  72 46 49 
    1 43 30  69 33 25 
    2 93 24  21 56 39 
    3 3 57  52 11 74 

    In [99]: A.values.sort 
    Out[99]: <function ndarray.sort> 

    In [100]: A 
    Out[100]: 
    one two three four five 
    0 22 63  72 46 49 
    1 43 30  69 33 25 
    2 93 24  21 56 39 
    3 3 57  52 11 74 

    In [101]: A.values.sort() 

    In [102]: A 
    Out[102]: 
    one two three four five 
    0 22 46  49 63 72 
    1 25 30  33 43 69 
    2 21 24  39 56 93 
    3 3 11  52 57 74 
    In [103]: A = A.iloc[:,::-1] 

    In [104]: A 
    Out[104]: 
    five four three two one 
    0 72 63  49 46 22 
    1 69 43  33 30 25 
    2 93 56  39 24 21 
    3 74 57  52 11 3 

Birisi

+0

'A.values', 'A' karakterinin temsili ifadesini döndürür; bu nedenle, bu' sort' yalnızca yerinde yapılan bir tür sıralamadır. – ptrj

1

Sen pd.apply kullanabilirsiniz) o 8 çalışmalardan oldukça mutlu, bu nasıl bir açıklayabiliriz umuyoruz. Eğer azalan düzende bunu istediğim için

Eg: 

A = pd.DataFrame(np.random.randint(0,100,(4,5)), columns=['one','two','three','four','five']) 
print (A) 

    one two three four five 
0 2 75  44 53 46 
1 18 51  73 80 66 
2 35 91  86 44 25 
3 60 97  57 33 79 

A = A.apply(np.sort, axis = 1) 
print(A) 

    one two three four five 
0 2 44  46 53 75 
1 18 51  66 73 80 
2 25 35  44 86 91 
3 33 57  60 79 97 

, sadece -1 ile dataframe çarpın ve sıralayabilir.

A = pd.DataFrame(np.random.randint(0,100,(4,5)), columns=['one','two','three','four','five']) 
A = A * -1 
A = A.apply(np.sort, axis = 1) 
A = A * -1 
İlgili konular