【Python】PandasのDataFrameでソートする方法

Pandas

この記事ではindex、column、値でソートする方法を紹介しています。

この記事の目標
・indexでソートする方法の理解
・列番号でソートする方法の理解
・値でソートする方法の理解

DataFrameとSeries型の違いがわからない人はまず以下の記事で理解しましょう!!
DataFrameとSeriesの違いを紹介
その他Pythonの記事は以下にまとめています!!

Python記事まとめ

[スポンサーリンク]


indexでソート

indexを使ってソートする場合はsort_indexメソッドを使用します。

指定のdf.sort_index(axis,ascending,inplace)
オプション名 デフォルト値 説明
axis   行か列かを指定
ascending  True  昇順か降順かを指定
inplace  False 上書きをするか否かの設定

 

特に引数を指定しなければindexを昇順でソートします。
indexでのソートを確認するために以下の行や列の番号がバラバラに配置されているDataFrameを使用します。

import pandas as pd
df=pd.DataFrame([[1,1,1],[0,1,1],[1,2,2],[0,2,2]],index=[3,2,0,1],columns=[1,0,2])
print(df)
"""
#出力結果
 1 0 2
3 1 1 1
2 0 1 1
0 1 2 2
1 0 2 2
"""

indexを昇順ソート

まずはindexを昇順ソートする場合です。
こちらはとても簡単で引数なしで実行すればできます。

実行前

print(df)
"""
#出力結果
 1 0 2
3 1 1 1
2 0 1 1
0 1 2 2
1 0 2 2
"""

実行後

df1=df.sort_index()
print(df1)
"""
#出力結果
 1 0 2
0 1 2 2
1 0 2 2
2 0 1 1
3 1 1 1
"""

indexが0,1,2,3と昇順でソートされていることがわかります。

indexを降順ソート

次にindexを降順でソートします。
降順の時はascendingオプションFalseにするだけです。

実行前

print(df)
"""
#出力結果
 1 0 2
3 1 1 1
2 0 1 1
0 1 2 2
1 0 2 2
"""

実行後

df1=df.sort_index(ascending=False)
print(df1)
"""
#出力結果
 1 0 2
3 1 1 1
2 0 1 1
1 0 2 2
0 1 2 2
"""

indexが3,2,1,0と降順でソートされていることがわかります。

列番号(column)を昇順ソート

次に列番号をソートする場合です。
列番号を指定する場合はaxis1とするだけです。

実行前

print(df)
"""
#出力結果
 1 0 2
3 1 1 1
2 0 1 1
0 1 2 2
1 0 2 2
"""

実行後

df1=df.sort_index(axis=1)
print(df1)
"""
#出力結果
 0 1 2
3 1 1 1
2 1 0 1
0 2 1 2
1 2 0 2
"""

列番号が0,1,2と昇順でソートされました。

列番号を降順ソート

次に列番号を降順でソートする時です。
axis1ascendingFalseにすることで列番号降順ソートが行われます。

実行前

print(df)
"""
#出力結果
 1 0 2
3 1 1 1
2 0 1 1
0 1 2 2
1 0 2 2
"""

実行後

df1=df.sort_index(axis=1,ascending=False)
print(df1)
"""
#出力結果
 2 1 0
3 1 1 1
2 1 0 1
0 2 1 2
1 2 0 2
"""

列番号が2,1,0と降順でソートされていることが確認できました。

inplaceオプション使用

inplaceオプションを使用すると元のDataFrameが上書きされます。
inplaceTrueにして行indexの昇順ソートで確認してみましょう。

実行前

print(df)
"""
#出力結果
 1 0 2
3 1 1 1
2 0 1 1
0 1 2 2
1 0 2 2
"""

実行後

df.sort_index(inplace=True)
print(df)
"""
#出力結果
 1 0 2
0 1 2 2
1 0 2 2
2 0 1 1
3 1 1 1
"""

戻り値を代入していないのにもかかわらず、ソート行われました。

まぁ以下と同じ動作ですね。

df=df.sort_index()

[スポンサーリンク]


valueでソート

indexではなく、値を元にソートしたい場合はsort_valuesメソッドを使用します。

sort_values(axis,ascending,inplace,np_position)
オプション名 デフォルト値 説明
by –  indexやcolumnの指定
axis 0 行か列かの指定
ascending  True 降順か昇順かの指定
inplace False 上書きするか否かの設定
na_position “last” 欠損値nanの扱い

 

では値のソートをするにあたって以下のDataFrameを使用します。

import pandas as pd
df=pd.DataFrame([[3,1,2],[4,6,5],[10,11,12],[9,8,7]],index=["one","two","three","four"],columns=["ONE","TWO","THREE"])
print(df)
"""
#出力結果
  ONE  TWO THREE
one  3  1 2
two  4   6 5
three 10  11 12
four 9    8 7
"""

 

指定列の値で行を昇順ソート

列を指定してその値をもとに昇順ソートを行います。
今回はONE列の値を元に昇順ソートします。

実行前

print(df)
"""
#出力結果
    ONE TWO THREE
one   3 1 2
two   4 6 5
three 10 11 12
four   9 8 7
"""

実行後

df1=df.sort_values(by=["ONE"])
print(df1)
""" 
#出力結果
ONE TWO THREE 
one 3 1 2 
two 4 6 5 
four 9 8 7 
three 10 11 12
"""

ONE列の値が昇順にソートされ、行が入れ替わっていることがわかります。

指定列の値で行を降順ソート

次に列を指定してその値を元に降順ソートします。
降順にする場合はascendingFalseにしましょう。
ではONE列の値を元に降順ソートします。

実行前

print(df)
"""
 #出力結果
   ONE TWO THREE
one    3 1 2
two    4 6 5
three 10 11 12
four   9 8 7
"""

実行後

df1=df.sort_values(by=["ONE"],ascending=False)
print(df1)
"""
#出力結果
     ONE TWO THREE
three 10 11 12
four   9 8 7
two    4 6 5
one    3 1 2
"""

降順ソートで行が入れ替わりました。

指定行の値で列を昇順ソート

先ほどは列の値を元に行をソートしていましたが、
次は行の値を元に列をソートしてみましょう。

列をソートする場合はaxis1にします。
ではone行の値を元に昇順ソートします。

実行前

print(df)
"""
#出力結果
     ONE TWO THREE
one   3 1 2
two   4 6 5
three 10 11 12
four   9 8 7
"""

実行後

df1=df.sort_values(by=["one"],axis=1)
print(df1)
"""
#出力結果
   TWO THREE ONE
one   1 2 3
two   6 5 4
three 11 12 10
four   8 7 9
"""

one行が0,1,2と昇順ソートされ、列が入れ替わったことが確認できます。

指定行の値で列を降順ソート

次に行を指定してその値を元に列を降順ソートします。
列をソートするのでaxis1とし、降順の場合はascendingFalseにします。

one行を元に降順ソートします。

実行前

print(df)
"""
#出力結果
     ONE TWO THREE
one   3 1 2
two   4 6 5
three 10 11 12
four   9 8 7
"""

実行後

df1=df.sort_values(by=["one"],axis=1,ascending=False)
print(df1)
"""
#出力結果
    ONE THREE TWO
one   3 2 1
two   4 5 6
three 10 12 11
four   9 7 8
"""

one行が2,1,0と降順でソートされ、列が入れ替わっていることが確認できます。

inplaceオプションで上書き

inplaceオプションを使用することで上書きすることができます。
inplaceTrueにしてONE列を昇順ソートで確認してみましょう。

実行前

print(df)
#出力結果
    ONE TWO THREE
one    3 1 2
two    4 6 5
three 10 11 12
four   9 8 7

実行後

df.sort_values(by=["ONE"],inplace=True)
print(df)
"""
#出力結果
   ONE TWO THREE
one   3 6 2
four  4 8 7
two   9 1 12
three 10 11 5
"""

dfが昇順ソートされて上書きされていることが確認できます。
まぁ以下と同じ動作です。

df=df.sort_values(by=["ONE"],inplace=True)

 

欠損値nanを先頭にソート

欠損値を含んだ値でソートする場合、デフォルトでは欠損値が最も下に表示されます。
確認するために欠損値nanを含んだ以下のDataFrameを使用します。

import pandas as pd
import numpy as np
df=pd.DataFrame([[3,6,2],[np.nan,1,12],[np.nan,11,5],[4,8,7]],index=["one","two","three","four"],columns=["ONE","TWO","THREE"])
print(df)
"""
#出力結果
    ONE TWO THREE
one   3.0 6 2
two   NaN 1 12
three NaN 11 5
four  4.0 8 7
"""

欠損値nanを含んだONE列をソートするとnanが一番下に表示されていることがわかります。
これは降順でも同じです。

df1=df.sort_values(by=["ONE"])
print(df1)
"""
#出力結果
     ONE TWO THREE
one   3.0 6 2
four  4.0 8 7
two   NaN 1 12
three NaN 11 5
"""

そこでnanを一番下ではなく、一番上表示でソートしたいという時はna_positionオプションを使用します。
デフォルトではlastなのでこれをfirstにします。

df1=df.sort_values(by=["ONE"],na_position="first")
print(df1)
"""
#出力結果
    ONE TWO THREE
two   NaN 1 12
three NaN 11 5
one   3.0 6 2
four  4.0 8 7
"""

欠損値nanが一番上となり、ソートされました。

複数の値でソート

もちろん複数指定してソートすることもできます。
複数指定する場合はリストの内容を増やすだけです。
では確認をするために以下のDataFrameを使用します。

import pandas as pd
df=pd.DataFrame([[1,6,2],[0,1,12],[1,11,5],[1,8,7]],index=["one","two","three","four"],columns=["ONE","TWO","THREE"])
print(df)
"""
#出力結果
   ONE TWO THREE
one   1 6 2
two   0 1 12
three 1 11 5
four  1 8 7
"""

ではONE列とTWO列を元に昇順ソートしてみましょう。

df1=df.sort_values(by=["ONE","TWO"])
print(df1)
"""
#出力結果
     ONE TWO THREE
two   0 1 12
one   1 6 2
four  1 8 7
three 1 11 5
"""

まずONE列で昇順ソートされ、次にONE列で数値がかぶっている1の部分はTWO列の値でソートが行われていることが確認できます。

[スポンサーリンク]


昇順ソートされているか確認

昇順ソートされているか確認するにはis_mootonicオブジェクトを使用します。

is_monotonicオブジェクトSeriesにおいて各要素が1つ前の要素と等しい、または大きい場合にTrueを返します。
つまり昇順であればTrueを返すことになります。
(ちなみにDataFrameでも列指定すればSeries型)

では確認のために以下のDataFrameを使用します。

import pandas as pd
df=pd.DataFrame([[1,2],[1,1],[2,3]])
print(df)
"""
#出力結果
  0 1
0 1 2
1 1 1
2 2 3
"""

このDataFrameでは0列目が昇順1列目はでたらめな順番になっています。
ではすでに昇順になっている0列目をis_monotonicオブジェクトで確認してみましょう。

print(df[0].is_monotonic) 
#出力結果 
#True

予想通りTrueが帰りました。

では次に1列目を確認してみます。

print(df[1].is_monotonic) 
#出力結果 
#False

昇順ではないのでFalseになりました。

コメント

  1. […] ・DataFrameやSeriesのソート […]

タイトルとURLをコピーしました