web-dev-qa-db-ja.com

複数の列の値を使用してpandasデータフレームを並べ替える方法は?

次のデータフレームがあります。

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
59
Roman

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'
69
falsetru

sortを使用すると、警告メッセージが表示される場合があります。 github の説明を参照してください。したがって、sort_values、docs here を使用できます

次に、コードは次のようになります。

df = df.sort_values(by=['c1','c2'], ascending=[False,True])
24
HonzaB

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
8
fotis j

私の場合、受け入れられた答えはうまくいきませんでした:

f.sort_values(by = ["c1"、 "c2"]、ascending = [False、True])

期待どおりに機能したのは次のとおりです。

f = f.sort_values(by=["c1","c2"], ascending=[False, True])
4
Pedro Lobito

このコードをスクリプトファイルとして記述する場合は、次のように記述する必要があります。

df = df.sort(['c1','c2'], ascending=[False,True])
2
Akash

注:ここまではすべて正しいです。sort->sort_values()したがって、次のようになります。

 import pandas as pd
 df = pd.read_csv('data.csv')
 df.sort_values(ascending=False,inplace=True)

公式ウェブサイト here を参照してください。

1
siddesh chavan

私はこれが本当に便利であることがわかりました:

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への実際の呼び出しは変更されていないことに注意してください。skws 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
1
miraculixx