Ben sütunlu bir dataframe olduğunu varsayalım a, bve cben sütuna göre dataframe sıralamak istediğiniz bartan düzende ve sütuna göre cazalan sırada, bu nasıl yapacağım?
Ben sütunlu bir dataframe olduğunu varsayalım a, bve cben sütuna göre dataframe sıralamak istediğiniz bartan düzende ve sütuna göre cazalan sırada, bu nasıl yapacağım?
Yanıtlar:
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)
sortyöntemin sonucunu bir değişkene atamanız veya inplace=Trueyöntem çağrısına eklemeniz gerekir.
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)
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'.