Edited at

Python sortのまとめ (リスト、辞書型、Series、DataFrame)

More than 3 years have passed since last update.

ソートはよく使いますが型によってちょこちょこ違うところがあるのでまとめます。

リスト、辞書型、Series、DataFrameでそれぞれまとめようと思います。

やり方は他にもあると思います。おすすめがあれば是非ご教示願います。


リスト

sortメソッドが一番楽だと思います。sortedメソッドも知っておくと柔軟に対応出来ると思います。

sortedメソッドはリスト自体に変更は起こさず返り値として並び替え後のリストを返すことに注意です。


昇順ソート


sortメソッド

lst = [3, 5, 2, 9, 0, 4]

lst.sort()
print(lst)
#=> [0, 2, 3, 4, 5, 9]


sorted関数

lst = [3, 5, 2, 9, 0, 4]

lst = sorted(lst)
print(lst)
#=> [0, 2, 3, 4, 5, 9]


降順ソート


sortメソッド

lst_rvs = [3, 5, 2, 9, 0, 4]

lst_rvs.sort()
lst_rvs.reverse()
print(lst_rvs)
#=> [9, 5, 4, 3, 2, 0]


sorted関数

lst = [3, 5, 2, 9, 0, 4]

lst = sorted(lst, key=lambda x: -x)
print(lst)
#=> [9, 5, 4, 3, 2, 0]


辞書型


key昇順ソート

リストでも使ったsorted関数を使います。辞書型で注意が必要なのは返り値としてリストが返ってくることです。

dct = { 2: 3, 3: 4, 1: 2, 0: 8, 4: 2 }

dct = sorted(dct.items())
print(dct)
#=> [(0, 8), (1, 2), (2, 3), (3, 4), (4, 2)]

以下のように使うのがイメージしやすいと思います。

dct = { 2: 3, 3: 4, 1: 2, 0: 8, 4: 2 }

for k, v in sorted(dct.items()):
print(str(k) + ": " + str(v))

0: 8

1: 2
2: 3
3: 4
4: 2

以降辞書型はfor文での出力形式で説明します。


key降順ソート

dct = {2: 3, 3: 4, 1: 2, 0: 8, 4: 2}

for k, v in sorted(dct.items(), key=lambda x: -x[0]):
print(str(k) + ": " + str(v))

4: 2

3: 4
2: 3
1: 2
0: 8


value昇順ソート

dct = {2: 3, 3: 4, 1: 2, 0: 8, 4: 2}

for k, v in sorted(dct.items(), key=lambda x: x[1]):
print(str(k) + ": " + str(v))

1: 2

4: 2
2: 3
3: 4
0: 8


value降順ソート

dct = {2: 3, 3: 4, 1: 2, 0: 8, 4: 2}

for k, v in sorted(dct.items(), key=lambda x: -x[1]):
print(str(k) + ": " + str(v))

0: 8

3: 4
2: 3
1: 2
4: 2


Series (pandas)


index昇順ソート

from pandas import Series

ser = Series({2: 3, 3: 4, 1: 2, 0: 8, 4: 2})
ser = ser.sort_index()
print(ser)

0    8

1 2
2 3
3 4
4 2
dtype: int64


index降順ソート

from pandas import Series

ser = Series({2: 3, 3: 4, 1: 2, 0: 8, 4: 2})
ser = ser.sort_index(ascending=False)
print(ser)

4    2

3 4
2 3
1 2
0 8
dtype: int64


value昇順ソート

from pandas import Series

ser = Series({2: 3, 3: 4, 1: 2, 0: 8, 4: 2})
ser = ser.sort_values()
print(ser)

1    2

4 2
2 3
3 4
0 8
dtype: int64


value降順ソート

from pandas import Series

ser = Series({2: 3, 3: 4, 1: 2, 0: 8, 4: 2})
ser = ser.sort_values(ascending=False)
print(ser)

0    8

3 4
2 3
4 2
1 2
dtype: int64


DataFrame (pandas)


labelでのソート


index昇順

from pandas import DataFrame

df = DataFrame([[3, 4, 2, 8, 2, 3], [3, 5, 1, 9, 4, 2], [9, 3, 1, 6, 3, 3]], index=[2,3,1], columns=["HP", "Attack", "Defence", "Special Attack", "Special Defence", "Speed"])
print(df)
df = df.sort_index()
print(df)

   HP  Attack  Defence  Special Attack  Special Defence  Speed

2 3 4 2 8 2 3
3 3 5 1 9 4 2
1 9 3 1 6 4 3
HP Attack Defence Special Attack Special Defence Speed
1 9 3 1 6 4 3
2 3 4 2 8 2 3
3 3 5 1 9 4 2


index降順

from pandas import DataFrame

df = DataFrame([[3, 4, 2, 8, 2, 3], [3, 5, 1, 9, 4, 2], [9, 3, 1, 6, 3, 3]], index=[2,3,1], columns=["HP", "Attack", "Defence", "Special Attack", "Special Defence", "Speed"])
print(df)
df = df.sort_index(ascending=False)
print(df)


HP Attack Defence Special Attack Special Defence Speed
2 3 4 2 8 2 3
3 3 5 1 9 4 2
1 9 3 1 6 3 3
HP Attack Defence Special Attack Special Defence Speed
3 3 5 1 9 4 2
2 3 4 2 8 2 3
1 9 3 1 6 3 3


column昇順

from pandas import DataFrame

df = DataFrame([[3, 4, 2, 8, 2, 3], [3, 5, 1, 9, 4, 2], [9, 3, 1, 6, 3, 3]], index=[2,3,1], columns=["HP", "Attack", "Defence", "Special Attack", "Special Defence", "Speed"])
print(df)
df = df.sort_index(axis=1)
print(df)

   HP  Attack  Defence  Special Attack  Special Defence  Speed

2 3 4 2 8 2 3
3 3 5 1 9 4 2
1 9 3 1 6 4 3
Attack Defence HP Special Attack Special Defence Speed
2 4 2 3 8 2 3
3 5 1 3 9 4 2
1 3 1 9 6 4 3


column降順

from pandas import DataFrame

df = DataFrame([[3, 4, 2, 8, 2, 3], [3, 5, 1, 9, 4, 2], [9, 3, 1, 6, 3, 3]], index=[2,3,1], columns=["HP", "Attack", "Defence", "Special Attack", "Special Defence", "Speed"])
print(df)
df = df.sort_index(axis=1, ascending=False)
print(df)

   HP  Attack  Defence  Special Attack  Special Defence  Speed

2 3 4 2 8 2 3
3 3 5 1 9 4 2
1 9 3 1 6 3 3
Speed Special Defence Special Attack HP Defence Attack
2 3 2 8 3 2 4
3 2 4 9 3 1 5
1 3 3 6 9 1 3


valueでのソート


column値指定昇順

from pandas import DataFrame

df = DataFrame([[3, 4, 2, 8, 2, 3], [3, 5, 1, 9, 4, 2], [9, 3, 1, 6, 3, 3]], index=[2,3,1], columns=["HP", "Attack", "Defence", "Special Attack", "Special Defence", "Speed"])
print(df)
df = df.sort_values(by="Special Defence")
print(df)


HP Attack Defence Special Attack Special Defence Speed
2 3 4 2 8 2 3
3 3 5 1 9 4 2
1 9 3 1 6 3 3
HP Attack Defence Special Attack Special Defence Speed
2 3 4 2 8 2 3
1 9 3 1 6 3 3
3 3 5 1 9 4 2


column値指定降順

from pandas import DataFrame

df = DataFrame([[3, 4, 2, 8, 2, 3], [3, 5, 1, 9, 4, 2], [9, 3, 1, 6, 3, 3]], index=[2,3,1], columns=["HP", "Attack", "Defence", "Special Attack", "Special Defence", "Speed"])
print(df)
df = df.sort_values(by="Special Defence", ascending=False)
print(df)

   HP  Attack  Defence  Special Attack  Special Defence  Speed

2 3 4 2 8 2 3
3 3 5 1 9 4 2
1 9 3 1 6 3 3
HP Attack Defence Special Attack Special Defence Speed
3 3 5 1 9 4 2
1 9 3 1 6 3 3
2 3 4 2 8 2 3


index指定

from pandas import DataFrame

df = DataFrame([[3, 4, 2, 8, 2, 3], [3, 5, 1, 9, 4, 2], [9, 3, 1, 6, 3, 3]], index=[2, 3, 1], columns=["HP", "Attack", "Defence", "Special Attack", "Special Defence", "Speed"])
print(df)
df = df.sort_values(by=3, axis=1)
print(df)

ValueError: When sorting by column, axis must be 0 (rows)

これで出来そうだったのに出来ない。。

BUG/ENH: sort_values(by=index_label, axis=1)

なるほど、今は出来ないらしい。次のメジャーバージョンアップで出来るようになるようです。

予定日 August 31, 2017 (2016 7/15現在)


参考

Pythonの辞書(dict型)をvalue値でソート

ソート HOW TO (document)

Python Tips:dict(辞書)型の中身をソートしたい

pandas.Series.sort_index

pandas.Series.sort_values

pandas.DataFrame.sort_index

pandas.DataFrame.sort_values