私は列を持つデータフレームを持っていると仮定しa
、b
そしてc
、私は列でデータフレームをソートするb
順序を昇順で、列でc
降順に、私はこれをどのように行うのですか?
私は列を持つデータフレームを持っていると仮定しa
、b
そしてc
、私は列でデータフレームをソートするb
順序を昇順で、列でc
降順に、私はこれをどのように行うのですか?
回答:
0.17.0リリース以降、このsort
メソッドは非推奨になりましたsort_values
。 sort
0.20.0リリースでは完全に削除されました。引数(および結果)は同じままです。
df.sort_values(['a', 'b'], ascending=[True, False])
次の昇順の引数を使用できますsort
。
df.sort(['a', 'b'], ascending=[True, False])
例えば:
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によるコメント
並べ替えはデフォルトでは設定されていません!したがって、sortメソッドの結果を変数に割り当てるか、メソッド呼び出しにinplace = Trueを追加する必要があります。
つまり、df1をソートされたDataFrameとして再利用する場合は、次のようにします。
df1 = df1.sort(['a', 'b'], ascending=[True, False])
または
df1.sort(['a', 'b'], ascending=[True, False], inplace=True)
sort
メソッドの結果を変数に割り当てるかinplace=True
、メソッド呼び出しに追加する必要があります。
数値データの大きなデータフレームの場合は、numpy.lexsort
キーのシーケンスを使用して間接ソートを実行することにより、パフォーマンスが大幅に向上する場合があります。
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
特徴の1つは、で定義された並べ替え順序numpy.lexsort
が逆になっていることです。最初に(-'b', 'a')
系列で並べ替えa
ます。b
このシリーズが降順であることを反映して、シリーズを否定します。
np.lexsort
は数値でのみソートpd.DataFrame.sort_values
し、文字列または数値で機能することに注意してください。np.lexsort
文字列で使用すると、次のようになりますTypeError: bad operand type for unary -: 'str'
。