次のデータフレームがあります。
df = pandas.DataFrame([{'c1':3,'c2':10},{'c1':2, 'c2':30},{'c1':1,'c2':20},{'c1':2,'c2':15},{'c1':2,'c2':100}])
または、人間が読める形式で:
c1 c2
0 3 10
1 2 30
2 1 20
3 2 15
4 2 100
次の並べ替えコマンドは期待どおりに機能します。
df.sort(['c1','c2'], ascending=False)
出力:
c1 c2
0 3 10
4 2 100
1 2 30
3 2 15
2 1 20
しかし、次のコマンド:
df.sort(['c1','c2'], ascending=[False,True])
結果として
c1 c2
2 1 20
3 2 15
1 2 30
4 2 100
0 3 10
これは私が期待するものではありません。最初の列の値を最大から最小の順に並べ、最初の列に同じ値がある場合は、2番目の列の昇順の値で並べ替えます。
なぜそれが期待どおりに機能しないのか誰も知っていますか?
追加
これはコピー&ペーストです:
>>> df.sort(['c1','c2'], ascending=[False,True])
c1 c2
2 1 20
3 2 15
1 2 30
4 2 100
0 3 10
DataFrame.sort
は非推奨です。 DataFrame.sort_values
を使用します。
>>> df.sort_values(['c1','c2'], ascending=[False,True])
c1 c2
0 3 10
3 2 15
1 2 30
4 2 100
2 1 20
>>> df.sort(['c1','c2'], ascending=[False,True])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/ampawake/anaconda/envs/pseudo/lib/python2.7/site-packages/pandas/core/generic.py", line 3614, in __getattr__
return object.__getattribute__(self, name)
AttributeError: 'DataFrame' object has no attribute 'sort'
Dataframe.sort()メソッドは-だから私の理解-pandas> 0.18で非推奨です。問題を解決するには、代わりにdataframe.sort_values()を使用する必要があります。
f.sort_values(by=["c1","c2"], ascending=[False, True])
出力は次のようになります。
c1 c2
3 10
2 15
2 30
2 100
1 20
私の場合、受け入れられた答えはうまくいきませんでした:
f.sort_values(by = ["c1"、 "c2"]、ascending = [False、True])
期待どおりに機能したのは次のとおりです。
f = f.sort_values(by=["c1","c2"], ascending=[False, True])
このコードをスクリプトファイルとして記述する場合は、次のように記述する必要があります。
df = df.sort(['c1','c2'], ascending=[False,True])
注:ここまではすべて正しいです。sort->sort_values()したがって、次のようになります。
import pandas as pd
df = pd.read_csv('data.csv')
df.sort_values(ascending=False,inplace=True)
公式ウェブサイト here を参照してください。
私はこれが本当に便利であることがわかりました:
df = pd.DataFrame({'A' : range(0,10) * 2, 'B' : np.random.randint(20,30,20)})
# A ascending, B descending
df.sort(**skw(columns=['A','-B']))
# A descending, B ascending
df.sort(**skw(columns=['-A','+B']))
標準のcolumns=,ascending=
引数とは異なり、ここでは列名とそのソート順は同じ場所にあることに注意してください。その結果、コードの読み取りと保守がはるかに簡単になります。
.sort
への実際の呼び出しは変更されていないことに注意してください。skw
(s ort kw args)は列を解析して返す小さなヘルパー関数です通常のcolumns=
およびascending=
パラメーター。通常どおり、他の種類のkwargsを渡します。次のコードをコピーして貼り付けます。ローカルutils.py
を忘れて、上記のように使用します。
# utils.py (or anywhere else convenient to import)
def skw(columns=None, **kwargs):
""" get sort kwargs by parsing sort order given in column name """
# set default order as ascending (+)
sort_cols = ['+' + col if col[0] != '-' else col for col in columns]
# get sort kwargs
columns, ascending = Zip(*[(col.replace('+', '').replace('-', ''),
False if col[0] == '-' else True)
for col in sort_cols])
kwargs.update(dict(columns=list(columns), ascending=ascending))
return kwargs