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.