Pythonライブラリ講座

【Pandas】DataFrameの並べ替え(ソート)をマスターしよう!

前のページ|次のページ

12章ではDataFrameの行や列を並べ替えるメソッドである『sort_values』『sort_index』について解説します。

練習問題も記事の最後に用意していますので、ぜひ最後まで読んでいってください!

本連載講座【Python ライブラリ編】では、データサイエンスに必要なPythonライブラリやその使い方を基礎から学ぶことができます。

NumPyPandasMatplotlibScipySeabornについて、初学者の方にも分かりやすいよう丁寧に解説しています。

さらに、学習した内容を定着させられるように各章演習問題を用意しています。

・Pythonでデータ分析ができるようになりたい

・Pythonの基礎事項は一通り学んだので、さらに深く学びたい

このように考えている方はTech Teacherが運営する【Python ライブラリ編】で、Pythonによるデータサイエンスの学習をすることをお勧めします!

なお、『Pythonについて全く知らない』・『Pythonの基礎事項がまだ分かっていない』という方は、まずコチラの【Python 基礎編】で基礎を一通り学習してからライブラリ編に取り掛かりましょう!

<ライブラリ編 目次>

<ライブラリの基礎>
1章:ライブラリとは

<NumPy>
2章:NumPyの概要と配列(ndarray)
3章:統計量や次元の取得/ソート
4章:配列のインデックス
5章:numpy.whereによる条件制御
6章:配列の結合/分割
7章:乱数

<SciPy>
8章:SciPyの概要と基本操作

<Pandas>
9章:SeriesDataFrame/統計量の取得
10章:データの読み込み/書き込み
11章:データの取り出し/追加
12章:データのソート
13章:データの結合
14章:階層型インデックス
15章:groupbyによる集計
16章:マッピング処理
17章:欠損値の扱い

<Matplotlib>
18章:Matplotlibの概要
19章:pyplotインターフェース
20章:オブジェクト指向インターフェース

<Seaborn>
21章:Seabornの概要と基本操作

元となるDataFrameの準備

本記事では以下のコードで定義されるDataFrame「df」を使用して解説をしていきます。

まずはコードを実行してデータを準備しましょう。

#DataFrameを作成
data = {
    "Employee": ["Charlie", "Bob", "David", "Alice", "Eva", "Grace", "Frank"],
    "Location": ["New York", "Los Angeles", "Chicago", "Chicago", "New York", "New York", "Los Angeles"],
    "Birth_Year": [1972, 1995, 1987, 1986, 1976, 1986, 1990],
    "Annual_Income": [85000, 72000, 63000, 55000, 49000, 68000, 92000],
    "Age":[52,29,37,38,48,38,34]
}

df = pd.DataFrame(data)
df
DataFrame1

sort_valuesによる並べ替え

sort_values』メソッドを用いると、DataFrameの行や列を、ある列(行)の値を基準に並べ替えることができます。

本記事ではsort_valuesの基本的な使い方に加えて、特に重要な引数について解説します。

基準の列を指定して並べ替え

sort_values』メソッドの基本的な使い方は以下の通りです。

df.sort_values(基準となる列の名)

引数として列名を渡すと、指定されたの値を基準にDataFrameのが並べ替えられます。

以下の例では、先ほど定義した「df」の行を、「Age」列の要素を基準に並べ替えています。

#Ageを基準に行を並べ替え
df.sort_values('Age')

#df:
#  Employee     Location  Birth_Year  Annual_Income  Age
#0  Charlie     New York        1972          85000   52
#1      Bob  Los Angeles        1995          72000   29
#2    David      Chicago        1987          63000   37
#3    Alice      Chicago        1986          55000   38
#4      Eva     New York        1976          49000   48
#5    Grace     New York        1986          68000   38
#6    Frank  Los Angeles        1990          92000   34
DataFrame2

Ageの値が小さい順に行が並べ替えられていることが分かると思います。

また、列名のリストを渡すことで複数の列を基準に並べ替えを行うことができます。

以下の例では、「Location」と「Age」の列を基準にDataFrameを並べ替えています。

#Location, Ageを基準に並べ替え
df.sort_values(['Location', 'Age'])

#df:
#  Employee     Location  Birth_Year  Annual_Income  Age
#0  Charlie     New York        1972          85000   52
#1      Bob  Los Angeles        1995          72000   29
#2    David      Chicago        1987          63000   37
#3    Alice      Chicago        1986          55000   38
#4      Eva     New York        1976          49000   48
#5    Grace     New York        1986          68000   38
#6    Frank  Los Angeles        1990          92000   34
DataFrame3

Location」を基準に並べ替えたうえで、さらに「Age」を基準とした並べ替えが行われています。

引数axis:並べ替えの方向を指定

引数『axis』により、並べ替えの方向を指定することができます。

・axis=0 → を並べ替え(ある列を基準にする)
・axis=1 →
を並べ替え(ある行を基準にする)

デフォルトではaxis=0に設定されています。

以下の例では、axis=1として「df」の行名「2」の行を基準に並べ替えを行っています。

なお、1つの行に数値と文字列が混在していると並べ替えを行うことができません。

そのため、今回の例では数値を要素として持つ列のみを抜き出したdataFrame「df_numbers」を新たに定義しています。

#数値の列のみを取り出す
df_numbers = df[['Birth_Year', 'Annual_Income', 'Age']]

df_numbers
DataFrame4
#「2」の行の値を基準に列を並べ替え
df_numbers.sort_values(2, axis=1)
DataFrame5

元のデータでは「2」の行は「1987, 63000, 37」となっていましたが、小さい順に「37, 1987, 63000」と並べ替えられました。

これに合わせて、DataFrameの列が「Age, Birth_Year, Annual_Income」の順に並べ替えられています。

引数ascending:降順・昇順の指定

引数『ascending』を用いると、並べ替えの降順・昇順を指定できます。

・ascending=True → 昇順(小さい順)で並べ替え
・ascending=False →
降順(大きい順)で並べ替え

デフォルトではTrueになっているので、昇順に並べ替えられます。

以下の例では、「Annual_Income」列を基準に降順で並べ替えを行っています。

#Annual_Incomeを基準に降順で並べ替え
df.sort_values('Annual_Income', ascending=False)

#df:
#  Employee     Location  Birth_Year  Annual_Income  Age
#0  Charlie     New York        1972          85000   52
#1      Bob  Los Angeles        1995          72000   29
#2    David      Chicago        1987          63000   37
#3    Alice      Chicago        1986          55000   38
#4      Eva     New York        1976          49000   48
#5    Grace     New York        1986          68000   38
#6    Frank  Los Angeles        1990          92000   34
DataFrame6

引数key:基準の列に関数で操作を加えてから並べ替え

引数『key』を用いると、基準となる列に関数で操作を加えた後、その列を基準に並べ替えを行うことができます。

key = 関数名」とすることで、関数を指定します。

このとき、指定する関数は基準となる列(Series)を引数として受け取り、Seriesやリストを返す関数である必要があります。

今回は「Birth_Year」の一の位が小さい順にdfを並べ替えることを考えます。

まずは与えられたSeriesの要素の一の位が格納されたSeriesを返す関数を作成します。

#Seriesの値の1の位だけを取り出す関数
def my_func(s):
    return s % 10

#入力に対する出力の例
#入力:[111, 312, 513, 714, 915]
#出力:[1, 2, 3, 4, 5]

この関数「my_func」をsort_valuesの引数keyとして指定すると、以下のような結果が得られます。

#my_funcをkeyに設定
df.sort_values('Birth_Year', key=my_func)

#df:
#  Employee     Location  Birth_Year  Annual_Income  Age
#0  Charlie     New York        1972          85000   52
#1      Bob  Los Angeles        1995          72000   29
#2    David      Chicago        1987          63000   37
#3    Alice      Chicago        1986          55000   38
#4      Eva     New York        1976          49000   48
#5    Grace     New York        1986          68000   38
#6    Frank  Los Angeles        1990          92000   34
DataFrame7

Birth_Year」の一の位を基準に行が並べ替えられていることが分かると思います。

また、keyで用いる関数として『無名関数(ラムダ式)』を用いることが多いです。

無名関数(ラムダ式)』は「def」を使用せずに簡潔に定義できる関数のことです。

lambda 引数: 引数に対する処理(戻り値)

と書くと、『:(コロン)』の右側の値が戻り値として返されます。

無名関数を用いて先ほのコードを書き換えると以下のようになります。

#無名関数を使用した場合
df.sort_values('Birth_Year', key=lambda s: s % 10)

#df:
#  Employee     Location  Birth_Year  Annual_Income  Age
#0  Charlie     New York        1972          85000   52
#1      Bob  Los Angeles        1995          72000   29
#2    David      Chicago        1987          63000   37
#3    Alice      Chicago        1986          55000   38
#4      Eva     New York        1976          49000   48
#5    Grace     New York        1986          68000   38
#6    Frank  Los Angeles        1990          92000   34
DataFrame8

上記の無名関数では、引数である「s」(Series)に対して「s % 10」、すなわち「sの各要素の一の位を格納したseries」が返されます。

実際、my_funcを用いた場合と同じ結果が得られています。

引数ignore_index:インデックスを振りなおす

引数『ignore_index』を用いると、並べ替え後のDataFrameに対して新たにインデックスを振りなおすことができます。

・ignore_index=False → インデックスごと並べ替え
・ignore_index=True → インデックスを振りなおす

デフォルトでは「ignore_index=False」となっています。

以下の例では、「Age」を基準に並べ替えを行う際、「ignore_index=True」としてインデックスを振りなおしています。

#インデックスを0から順に振りなおす
df.sort_values('Age', ignore_index=True)

#df:
#  Employee     Location  Birth_Year  Annual_Income  Age
#0  Charlie     New York        1972          85000   52
#1      Bob  Los Angeles        1995          72000   29
#2    David      Chicago        1987          63000   37
#3    Alice      Chicago        1986          55000   38
#4      Eva     New York        1976          49000   48
#5    Grace     New York        1986          68000   38
#6    Frank  Los Angeles        1990          92000   34
DataFrame8

左のインデックスに注目すると、確かにインデックスが振りなおされていることが分かります。

sort_indexによる並べ替え

sort_index』メソッドを用いると、DataFrameの行名(インデックス)や列名を基準に並べ替えを行うことができます。

行名を基準に並べ替え(axis=0)

sort_index』メソッドの引数『axis』はデフォルトで0となっており、axis=0のとき行名(インデックス)を基準に並べ替えを行います。

このとき、DataFrameの行が並べ替えられることに注意しましょう。

以下の例では、dfの「Employee」列をインデックスに設定した「df2」を作成し、df2を行名を基準に並べ替えています。

#Employeeをインデックスに設定
df2 = df.set_index('Employee')
df2
DataFrame9
#デフォルトではインデックス(行名)を基準に並べ替え
df2.sort_index()
DataFrame10

デフォルトではインデックス(Employee)を基準に並べ替えが行われることが確認できました。

列名を基準に並べ替え(axis=1)

引数『axis』を1に設定すると、列名を基準に並べ替えが行われます。

この場合は、DataFrameの列が並べ替えられることに注意しましょう。

#列名を基準に列を並べ替え
df.sort_index(axis=1)

#df:
#  Employee     Location  Birth_Year  Annual_Income  Age
#0  Charlie     New York        1972          85000   52
#1      Bob  Los Angeles        1995          72000   29
#2    David      Chicago        1987          63000   37
#3    Alice      Chicago        1986          55000   38
#4      Eva     New York        1976          49000   48
#5    Grace     New York        1986          68000   38
#6    Frank  Los Angeles        1990          92000   34
DataFrame11

列名が辞書順になるように、dfの各列が並べ替えられていることが分かると思います。

その他の引数(sort_valuesと同じ)

ここまで『sort_index』メソッドの引数axisについて紹介しましたが、その他の引数についてはsort_valuesメソッドと同様です。

以下の例では、引数「ascending」をFalseに設定し、行名の降順でdfの行を並べ替えています。

#降順に並べ替え
df.sort_index(ascending=False)

#df:
#  Employee     Location  Birth_Year  Annual_Income  Age
#0  Charlie     New York        1972          85000   52
#1      Bob  Los Angeles        1995          72000   29
#2    David      Chicago        1987          63000   37
#3    Alice      Chicago        1986          55000   38
#4      Eva     New York        1976          49000   48
#5    Grace     New York        1986          68000   38
#6    Frank  Los Angeles        1990          92000   34
DataFrame12

12章の練習問題

以下の練習問題を解いてみましょう。

練習問題

問1. 以下のコードで定義されるDataFrame「df」について、(1)~(2)を出力するプログラムを書いてください。

#DataFrameを作成
data = {
    "Employee": ["Charlie", "Bob", "David", "Alice", "Eva", "Grace", "Frank"],
    "Location": ["New York", "Los Angeles", "Chicago", "Chicago", "New York", "New York", "Los Angeles"],
    "Birth_Year": [1972, 1995, 1987, 1986, 1976, 1986, 1990],
    "Annual_Income": [85000, 72000, 63000, 55000, 49000, 68000, 92000],
    "Age":[52,29,37,38,48,38,34]
}

df = pd.DataFrame(data)
df

(1) 「Annual_Income」列を基準に行を並べ替えたDataFrame
(2) 「Employee」列の文字列長を基準に、降順で行を並べ替えたDataFrame(ヒント:文字列を要素として持つSeriesの各文字列の長さは「Series名.str.len()」で取得できます。)

問2. 問1で用いたdfに対して、以下の条件を満たすDataFrameを出力するプログラムを書いてください。

dfの列名の長さを基準に、降順で列を並べ替えたDataFrame

解答

問1(クリックして解答を表示)

(1)

#(1)
df.sort_values('Annual_Income')
DataFrame13

(2)

#(2)
df.sort_values('Employee', ascending=False, key=lambda x: x.str.len())
DataFrame14

問2(クリックして解答を表示)

#(2)
df.sort_index(axis=1, ascending=False, key=lambda x: x.str.len())
DataFrame15

次のページへ

concat,merge,joinの違いは?DataFrameの結合を徹底解説! 前のページ|次のページ 13章ではPandasのDataFrameの結合方法である『内部結合・外部結合・左結合・右結合』について...