この記事ではindex、column、値でソートする方法を紹介しています。
この記事の目標
・indexでソートする方法の理解
・列番号でソートする方法の理解
・値でソートする方法の理解
DataFrameとSeries型の違いがわからない人はまず以下の記事で理解しましょう!!
「DataFrameとSeriesの違いを紹介」
その他Pythonの記事は以下にまとめています!!
「Python記事まとめ」
[スポンサーリンク]
indexでソート
indexを使ってソートする場合はsort_indexメソッドを使用します。
指定のdf.sort_index(axis,ascending,inplace)
オプション名 | デフォルト値 | 説明 |
axis | 0 | 行か列かを指定 |
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)を昇順ソート
次に列番号をソートする場合です。
列番号を指定する場合はaxisを1とするだけです。
実行前
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と昇順でソートされました。
列番号を降順ソート
次に列番号を降順でソートする時です。
axisを1、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(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が上書きされます。
inplaceをTrueにして行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列の値が昇順にソートされ、行が入れ替わっていることがわかります。
指定列の値で行を降順ソート
次に列を指定してその値を元に降順ソートします。
降順にする場合はascendingをFalseにしましょう。
では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
"""
降順ソートで行が入れ替わりました。
指定行の値で列を昇順ソート
先ほどは列の値を元に行をソートしていましたが、
次は行の値を元に列をソートしてみましょう。
列をソートする場合はaxisを1にします。
では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と昇順ソートされ、列が入れ替わったことが確認できます。
指定行の値で列を降順ソート
次に行を指定してその値を元に列を降順ソートします。
列をソートするのでaxisを1とし、降順の場合はascendingをFalseにします。
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オプションを使用することで上書きすることができます。
inplaceをTrueにして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になりました。
コメント
[…] ・DataFrameやSeriesのソート […]