Python で解析 19

“Advent Calendar 2013 - Python で解析!” の十九日目。DataFrame - 14

今回は sort を取り上げる。だいたい想像している通りのことができる。

1. データの準備

では、いつもの通りのデータの準備を。

In [1]: import pandas as pd

In [2]: df = pd.DataFrame({
   ...:   u'1_睦月': [18100, 22000, 6800, 14100],
   ...:   u'2_如月': [14600, 29000, 8800, 12100],
   ...:   u'3_弥生': [9900, 12000, 12000, 8500]
   ...: }, index = [u'山田', u'鈴木', u'佐藤', u'木村'])

In [3]: df
Out[3]:
     1_睦月   2_如月   3_弥生
山田  18100  14600   9900
鈴木  22000  29000  12000
佐藤   6800   8800  12000
木村  14100  12100   8500

2. index で並び替え

引数なしでソートすると、 index でのソートになる。

In [4]: df.sort()
Out[4]:
     1_睦月   2_如月   3_弥生
佐藤   6800   8800  12000
山田  18100  14600   9900
木村  14100  12100   8500
鈴木  22000  29000  12000

漢字の場合、文字コード順で並び替えることは実用的ではないので、ふりがななどの適切なデータを使うところだが、あえて漢字で実験してみた。

なお、明示的に index を指定しない場合は、シーケンス番号が index として振られるので、sort() を呼び出しても何も起こらない。

3, 指定したカラムで並び替え

カラムを指定したソートは次の通り。

In [5]: df.sort(u'3_弥生')
Out[5]:
     1_睦月   2_如月   3_弥生
木村  14100  12100   8500
山田  18100  14600   9900
鈴木  22000  29000  12000
佐藤   6800   8800  12000

複数のカラムを指定することもできる。

In [6]: df.sort([u'3_弥生', u'2_如月'])
Out[6]:
     1_睦月   2_如月   3_弥生
木村  14100  12100   8500
山田  18100  14600   9900
佐藤   6800   8800  12000
鈴木  22000  29000  12000

3, 指定したカラムで降順で並び替え

デフォルトでは昇順だが、降順も指定できる。

In [7]: df.sort(u'3_弥生', ascending=False)
Out[7]:
     1_睦月   2_如月   3_弥生
佐藤   6800   8800  12000
鈴木  22000  29000  12000
山田  18100  14600   9900
木村  14100  12100   8500

複数のカラムで、昇順と降順を混在させることもできる。

In [8]: df.sort([u'3_弥生', u'2_如月'], ascending=[True, False])
Out[8]:
     1_睦月   2_如月   3_弥生
木村  14100  12100   8500
山田  18100  14600   9900
鈴木  22000  29000  12000
佐藤   6800   8800  12000

4, 列の並び替え

axis を指定すれば、列の並び替えもできる。

In [9]: df.sort(axis=1, ascending=False)
Out[9]:
     3_弥生   2_如月   1_睦月
山田   9900  14600  18100
鈴木  12000  29000  22000
佐藤  12000   8800   6800
木村   8500  12100  14100

axis は 0 が縦方向、 1 が横方向を意味する。

axis を使わずに、こんなやり方もできる。

In [10]: df.T.sort(ascending=False).T
Out[10]:
     3_弥生   2_如月   1_睦月
山田   9900  14600  18100
鈴木  12000  29000  22000
佐藤  12000   8800   6800
木村   8500  12100  14100

今回はこんなところで。