Python pandalarındaki dataFrame'i iki veya daha fazla sütuna göre nasıl sıralayabilirim?


Yanıtlar:


455

0.17.0 sürümünden itibaren sortyöntem lehine kaldırılmıştır sort_values. sort0.20.0 sürümünde tamamen kaldırıldı. Argümanlar (ve sonuçlar) aynı kalır:

df.sort_values(['a', 'b'], ascending=[True, False])

Aşağıdakilerin artan argümanını kullanabilirsiniz sort:

df.sort(['a', 'b'], ascending=[True, False])

Örneğin:

In [11]: df1 = pd.DataFrame(np.random.randint(1, 5, (10,2)), columns=['a','b'])

In [12]: df1.sort(['a', 'b'], ascending=[True, False])
Out[12]:
   a  b
2  1  4
7  1  3
1  1  2
3  1  2
4  3  2
6  4  4
0  4  3
9  4  3
5  4  1
8  4  1

@Renadeen tarafından yorumlandığı gibi

Sıralama varsayılan olarak yerinde değildir! Bu nedenle, bir değişkene sıralama yönteminin sonucunu atamanız veya yöntem çağrısına inplace = True eklemeniz gerekir.

yani, df1'i sıralı bir DataFrame olarak yeniden kullanmak istiyorsanız:

df1 = df1.sort(['a', 'b'], ascending=[True, False])

veya

df1.sort(['a', 'b'], ascending=[True, False], inplace=True)

7
Sıralama varsayılan olarak yerinde değildir! Bu nedenle, sortyöntemin sonucunu bir değişkene atamanız veya inplace=Trueyöntem çağrısına eklemeniz gerekir.
— renadeen

2
@renadeen çok iyi bir noktaya, ben bu yorum ile cevap güncelledim.
— Andy Hayden

1
Bugün bu türden vazgeçildiğini öğrenmek beni şaşırttı! Bu meta gönderideki bazı görüşlere dayanarak: meta.stackoverflow.com/questions/297404/… Sizinkine bir düzenleme yapmaya çalışmak yerine yeni bir cevap eklemeye karar verdim
— Kyle Heuton

2
@Snoozer Evet, türlerin hiç gitmeyeceğini sanmıyorum (esas olarak Wes'in kitabında yaygın olarak kullanıldığı gibi), ancak sıralamada bazı büyük değişiklikler oldu . Teşekkürler! .. Gerçekten tüm 1000'lerim panda cevapları üzerinden amortisman geçmesi otomatikleştirmek gerekir!
— Andy Hayden

40

Pandalar 0.17.0'dan itibaren DataFrame.sort()kullanımdan kaldırılmıştır ve gelecekteki bir panda sürümünde kaldırılacak şekilde ayarlanmıştır. Bir veri çerçevesini değerlerine göre sıralamanın yolu artıkDataFrame.sort_values

Bu nedenle, sorunuzun cevabı şimdi

df.sort_values(['b', 'c'], ascending=[True, False], inplace=True)

4

Sayısal verilerin büyük veri çerçeveleri için, numpy.lexsortbir anahtar dizisi kullanarak dolaylı bir sıralama gerçekleştiren önemli bir performans artışı görebilirsiniz :

import pandas as pd
import numpy as np

np.random.seed(0)

df1 = pd.DataFrame(np.random.randint(1, 5, (10,2)), columns=['a','b'])
df1 = pd.concat([df1]*100000)

def pdsort(df1):
    return df1.sort_values(['a', 'b'], ascending=[True, False])

def lex(df1):
    arr = df1.values
    return pd.DataFrame(arr[np.lexsort((-arr[:, 1], arr[:, 0]))])

assert (pdsort(df1).values == lex(df1).values).all()

%timeit pdsort(df1)  # 193 ms per loop
%timeit lex(df1)     # 143 ms per loop

Bir özellik, tanımlanan sıralama düzeninin numpy.lexsorttersine çevrilmesidir: önce (-'b', 'a')serilere göre sıralar a. Serileri b, bu serilerin azalan sırada olmasını istediğimizi yansıtmak için reddediyoruz .

Dize veya sayısal değerlerle np.lexsortçalışırken , yalnızca sayısal değerlerle pd.DataFrame.sort_valuessıralandığını unutmayın. Kullanılması np.lexsortdizeleri ile verecektir: TypeError: bad operand type for unary -: 'str'.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.