【3分動画 リファレンス】Pandas 並び替え【いきなり実践】

メソッドsort_values()、メソッドsort_index()

sort_values() 引数について

引数説明渡す値デフォルト
by並び替える要素名str, strのリスト*必須
axis並び替えの方向「0 か ‘index’」,「1 か ‘columns’」0
ascending昇順か降順かTrue(昇順), False(降順)True(昇順)
inplace元のデータと置き換えるかTrue(置き換える), False(置き換えない)False(置き換えない)
kind並び替えのアルゴリズム{‘quicksort’, ‘mergesort’, ‘heapsort’}‘quicksort’
na_position欠損値NaNを末尾にするか先頭にするか‘last'(末尾), ‘first'(先頭)‘last'(末尾)

sort_index() 引数について

引数説明渡す値デフォルト
axis行名、列名どちらで並び替えるか「0 か ‘index’」,「1 か ‘columns’」0
level並び替えの階層int, level名, intのリスト, level名のリストNone
ascending昇順か降順かTrue(昇順), False(降順)True(昇順)
inplace元のデータと置き換えるかTrue(置き換える), False(置き換えない)False(置き換えない)
kind並び替えのアルゴリズム{‘quicksort’, ‘mergesort’, ‘heapsort’}‘quicksort’
na_position欠損値NaNを末尾にするか先頭にするか‘last'(末尾), ‘first'(先頭)‘last'(末尾)
sort_remainingMultiIndexで階層を指定した場合はその階層で並び替えた後に他の階層でも並び替えるかTrue(並び替える), False(並び替えない)True

サンプルコードで解説

pandasのデータフレームの並び替えについて詳しく学びます。

それでは、実際に都道県別人口推移のデータで練習しましょう。
このデータは、こちらのURLからファイルをダウンロードできますので、デスクトップに保存してください。

pandasとosをインポートし、dfという変数に、デスクトップにあるcsvファイルを読み込みます。

In [1]:
import pandas as pd
import os

データフレームを表示する際の行の数、列の数を予め設定します。
こうすることで自分の見やすいサイズに省略して表示することができます。
ここでは最大10列、10行に設定します。

In [2]:
pd.set_option('display.max_columns', 10) # 最大表示列数
pd.set_option('display.max_rows', 10) # 最大表示行数

もうひとつ表示に関する設定で、実行に影響のないワーニングを表示させないようにします。

In [3]:
import warnings
warnings.filterwarnings('ignore')
In [4]:
os.chdir('/Users/kinocode/Desktop/')
df = pd.read_csv('datas.csv', header=0, index_col=0, encoding='shift-jis')
In [5]:
df.head()
Out[5]:
都道府県名元号和暦(年)西暦(年)人口(総数)人口(男)人口(女)
都道府県コード
1北海道大正9.01920.0235918312443221114861
2青森県大正9.01920.0756454381293375161
3岩手県大正9.01920.0845540421069424471
4宮城県大正9.01920.0961768485309476459
5秋田県大正9.01920.0898537453682444855

このようなデータセットです。
ここから、1990年のデータを抽出して、使用します。

In [6]:
df_1990 = df[df['西暦(年)'] == 1990]
In [7]:
df_1990
Out[7]:
都道府県名元号和暦(年)西暦(年)人口(総数)人口(男)人口(女)
都道府県コード
1北海道平成2.01990.0564364727229882920659
2青森県平成2.01990.01482873704758778115
3岩手県平成2.01990.01416928680197736731
4宮城県平成2.01990.0224855811051031143455
5秋田県平成2.01990.01227478584678642800
43熊本県平成2.01990.01840326869441970885
44大分県平成2.01990.01236942584672652270
45宮崎県平成2.01990.01168907551524617383
46鹿児島県平成2.01990.01797824842474955350
47沖縄県平成2.01990.01222398598669623729

47 rows × 7 columns

47行あるので、問題なく抽出できているようです。

データフレームの列で並び替え

このデータフレームを、列で並び替えをしましょう。
並び替えでは、「昇順」「降順」という言葉が使われますが、「昇順」は小さい方から大きい方へ、「降順」は大きい方から小さい方へ並び替えることを言います。
並び替えは、メソッドsort_values()を使います。
では、「人口(総数)」の列で昇順に並び替えます。

昇順に並び替え

In [8]:
df_1990.sort_values(by='人口(総数)' ,ascending=True)
Out[8]:
都道府県名元号和暦(年)西暦(年)人口(総数)人口(男)人口(女)
都道府県コード
31鳥取県平成2.01990.0615722294899320823
32島根県平成2.01990.0781021373618407403
18福井県平成2.01990.0823585400391423194
39高知県平成2.01990.0825034389063435971
36徳島県平成2.01990.0831598395906435692
11埼玉県平成2.01990.0640531932458683159451
23愛知県平成2.01990.0669060333548273335776
14神奈川県平成2.01990.0798039140981473882244
27大阪府平成2.01990.0873451643081844426332
13東京都平成2.01990.01185556359697735885790

47 rows × 7 columns

降順に並び替え

そして多い順、降順の場合はこうです。
メソッドsort_values()の引数、ascending=Falseとすることで降順になります。

In [9]:
df_1990.sort_values(by='人口(総数)', ascending=False)
Out[9]:
都道府県名元号和暦(年)西暦(年)人口(総数)人口(男)人口(女)
都道府県コード
13東京都平成2.01990.01185556359697735885790
27大阪府平成2.01990.0873451643081844426332
14神奈川県平成2.01990.0798039140981473882244
23愛知県平成2.01990.0669060333548273335776
11埼玉県平成2.01990.0640531932458683159451
36徳島県平成2.01990.0831598395906435692
39高知県平成2.01990.0825034389063435971
18福井県平成2.01990.0823585400391423194
32島根県平成2.01990.0781021373618407403
31鳥取県平成2.01990.0615722294899320823

47 rows × 7 columns

このascendingという引数は省略できます。
省略した場合は、デフォルトではascending=Trueのため、昇順になります。

欠損値がある場合

並び替えたい列に欠損値(NaN)があるデータは、末尾になります。
これはデフォルトが引数na_position='last'だからです。
これを先頭にしたい時は引数na_position='first'とすることで指定できます。

In [10]:
df_1990.sort_values(by='人口(総数)', ascending=False, na_position='first')
# 欠損値がないので結果は変わりません。
Out[10]:
都道府県名元号和暦(年)西暦(年)人口(総数)人口(男)人口(女)
都道府県コード
13東京都平成2.01990.01185556359697735885790
27大阪府平成2.01990.0873451643081844426332
14神奈川県平成2.01990.0798039140981473882244
23愛知県平成2.01990.0669060333548273335776
11埼玉県平成2.01990.0640531932458683159451
36徳島県平成2.01990.0831598395906435692
39高知県平成2.01990.0825034389063435971
18福井県平成2.01990.0823585400391423194
32島根県平成2.01990.0781021373618407403
31鳥取県平成2.01990.0615722294899320823

47 rows × 7 columns

元のデータフレームを並び替えた結果に置き換え

もうひとつ、便利な引数にinplaceがあります。
これは、並び替えた結果を元のデータフレームと置き換えるかどうかを指定することができます。
デフォルトではinplace=False、置き換えはされません。
データフレームをコピーをしてから、次のコードを実行して確認してみましょう。

In [11]:
df_1990_c = df_1990.copy()
df_1990_c.sort_values(by='人口(総数)', inplace=True)

元のデータフレームをみてみます。

In [12]:
df_1990_c
Out[12]:
都道府県名元号和暦(年)西暦(年)人口(総数)人口(男)人口(女)
都道府県コード
31鳥取県平成2.01990.0615722294899320823
32島根県平成2.01990.0781021373618407403
18福井県平成2.01990.0823585400391423194
39高知県平成2.01990.0825034389063435971
36徳島県平成2.01990.0831598395906435692
11埼玉県平成2.01990.0640531932458683159451
23愛知県平成2.01990.0669060333548273335776
14神奈川県平成2.01990.0798039140981473882244
27大阪府平成2.01990.0873451643081844426332
13東京都平成2.01990.01185556359697735885790

47 rows × 7 columns

昇順に置き換えられていることが確認できました。

複数の列で並び替え

並び替えをしたい列が複数ある場合は、by=[カラム名1,カラム名2]'とリストで渡します。
リストの先頭のカラム1が優先されて並び替えられます。
さらに、カラム1を昇順、カラム2を降順にしたい場合は、引数にascending=[True,False]とここもリストで渡します。
では次のわかりやすい例でみてみましょう。

In [22]:
df2 = pd.DataFrame({'A': ['a', 'b', 'b', 'b', 'a'], 
                   'B': [130 , 110 , 120 , 140 , 150]},
                  index = ['2000年', '2001年', '2002年', '2003年', '2004年'])
In [23]:
df2
Out[23]:
AB
2000年a130
2001年b110
2002年b120
2003年b140
2004年a150

このデータを、Aを昇順、Bを降順で並び替えてみます。

In [24]:
df2.sort_values(by=['A', 'B'], ascending=[True,False])
Out[24]:
AB
2004年a150
2000年a130
2003年b140
2002年b120
2001年b110

Aが優先されて昇順になり、それに準じてBが降順になっていることがわかります。

漢字の並び替え?

さて、人口という数字での並び替えをしましたが、あいうえお順やアルファベット順での並べ替えもできます。
漢字を使用している「都道府県名」の列でうまく並び替えできるか試してみましょう。

In [14]:
df_1990.sort_values(by='都道府県名')
Out[14]:
都道府県名元号和暦(年)西暦(年)人口(総数)人口(男)人口(女)
都道府県コード
24三重県平成2.01990.01792514869515922999
26京都府平成2.01990.0260246012676201334840
41佐賀県平成2.01990.0877851414673463178
28兵庫県平成2.01990.0540504026196922785348
1北海道平成2.01990.0564364727229882920659
22静岡県平成2.01990.0367084018089511861889
37香川県平成2.01990.01023412491621531791
39高知県平成2.01990.0825034389063435971
31鳥取県平成2.01990.0615722294899320823
46鹿児島県平成2.01990.01797824842474955350

47 rows × 7 columns

これはうまくいきませんでした・・・漢字の場合は、思った通りの結果が得られないようです。
今回使用したようなデータでは、「都道府県コード」のように予め数字をセットにしておくと後々のメンテナンスなどで役立つことがあります。
漢字のような、数字、ひらがな、カタカナ、アルファベット以外をデータに用いる場合は気をつけてみてください。

データフレームの行で並び替え

続いて、データフレームの行で並び替えをしてみましょう。

わかりやすいように、データフレームの縦横、インデックスとカラムを入れ替えてみます。
DataFrame.T と書くことで、転置できます。

In [15]:
df_1990_t = df_1990.T
In [16]:
df_1990_t
Out[16]:
都道府県コード123454344454647
都道府県名北海道青森県岩手県宮城県秋田県熊本県大分県宮崎県鹿児島県沖縄県
元号平成平成平成平成平成平成平成平成平成平成
和暦(年)2222222222
西暦(年)1990199019901990199019901990199019901990
人口(総数)5643647148287314169282248558122747818403261236942116890717978241222398
人口(男)27229887047586801971105103584678869441584672551524842474598669
人口(女)29206597781157367311143455642800970885652270617383955350623729

7 rows × 47 columns

これで、縦横が逆になりました。

行で並び替え

このデータで、先ほどまでと同様、「人口(総数)」を軸に並び替えてみましょう。
行を軸にしたい場合は引数axis=1とします。

In [17]:
df_1990_t.sort_values(by='人口(総数)', axis=1)
Out[17]:
都道府県コード31321839361123142713
都道府県名鳥取県島根県福井県高知県徳島県埼玉県愛知県神奈川県大阪府東京都
元号平成平成平成平成平成平成平成平成平成平成
和暦(年)2222222222
西暦(年)1990199019901990199019901990199019901990
人口(総数)615722781021823585825034831598640531966906037980391873451611855563
人口(男)29489937361840039138906339590632458683354827409814743081845969773
人口(女)32082340740342319443597143569231594513335776388224444263325885790

7 rows × 47 columns

縦横を入れ替えた状態で、先ほどと同じ結果が得られました。

他の引数も先ほどと同じように指定できますので、降順ならascending=False、欠損値を先頭にしたければna_position='first'、元のデータと置き換えるときはinplace=Trueと引数を追加します。

In [18]:
df_1990_t.sort_values(by='人口(総数)', axis=1, ascending=False, na_position='first' ,inplace=True)
In [19]:
df_1990_t
Out[19]:
都道府県コード13271423113639183231
都道府県名東京都大阪府神奈川県愛知県埼玉県徳島県高知県福井県島根県鳥取県
元号平成平成平成平成平成平成平成平成平成平成
和暦(年)2222222222
西暦(年)1990199019901990199019901990199019901990
人口(総数)118555638734516798039166906036405319831598825034823585781021615722
人口(男)59697734308184409814733548273245868395906389063400391373618294899
人口(女)58857904426332388224433357763159451435692435971423194407403320823

7 rows × 47 columns

降順に並び替えられ、データが置き換えられていることがわかります。

データフレームの行名、列名で並び替え

行名(インデックス名)で並び替え

次に、データフレームの行名、列名で並び替える方法です。

先ほど昇順に置き換えたdf_1990_cというデータフレームを、行名(インデックス名)で並び替えてみましょう。
メソッドsort_index()を使います。

In [20]:
df_1990.sort_index()
Out[20]:
都道府県名元号和暦(年)西暦(年)人口(総数)人口(男)人口(女)
都道府県コード
1北海道平成2.01990.0564364727229882920659
2青森県平成2.01990.01482873704758778115
3岩手県平成2.01990.01416928680197736731
4宮城県平成2.01990.0224855811051031143455
5秋田県平成2.01990.01227478584678642800
43熊本県平成2.01990.01840326869441970885
44大分県平成2.01990.01236942584672652270
45宮崎県平成2.01990.01168907551524617383
46鹿児島県平成2.01990.01797824842474955350
47沖縄県平成2.01990.01222398598669623729

47 rows × 7 columns

行名「都道府県コード」できれいに並び替えられたことがわかります。

このメソッドsort_index()にも、メソッドsort_values()と同様の引数がありますので、降順にしたい場合はascendinf=False、置き換えたい場合はinplace=Trueと指定することができます。

列名(カラム名)で並び替え

縦横を転置し、先ほど降順に置き換えたデータフレームも、列名(カラム名)で並び替えてみましょう。

In [21]:
df_1990_t.sort_index(axis=1)
Out[21]:
都道府県コード123454344454647
都道府県名北海道青森県岩手県宮城県秋田県熊本県大分県宮崎県鹿児島県沖縄県
元号平成平成平成平成平成平成平成平成平成平成
和暦(年)2222222222
西暦(年)1990199019901990199019901990199019901990
人口(総数)5643647148287314169282248558122747818403261236942116890717978241222398
人口(男)27229887047586801971105103584678869441584672551524842474598669
人口(女)29206597781157367311143455642800970885652270617383955350623729

7 rows × 47 columns

こちらも列名「都道府県コード」で並び替えられたことがわかります。

最後に少し補足です。
sort_values()、sort_index()、双方のメソッドで出てきたaxisという引数は、axis=1と書いてきましたが、axis=columnsとも書けます。
これは、並び替えの軸の方向を指定する引数で、つまりこの場合はカラム方向、横を軸に並び替えるということを意味しています。
反対に、デフォルトはaxis=0,axis=indexですので、インデックス方向、縦を軸に並び替えをするということを意味しています。
よく使用されるのは0,1を使用したaxis=1での指定ですが、わかりにくいと感じた方は、軸にする方向がaxis=columns横と覚えるとよいかもしれません。