【Pandasデータ整理術】DataFrameとSeriesを思い通りにソート!sort_values, sort_index徹底解説


 

データ分析の際、データを特定の順序に並べ替える(ソートする)ことは、傾向の把握、異常値の発見、または可視化の前準備として非常に重要です。Pandasでは、DataFrameやSeriesのデータを並べ替えるために、値に基づいたソートを行うsort_values()と、インデックスに基づいたソートを行うsort_index()という2つの強力なメソッドが提供されています。この記事では、これらのメソッドの基本的な使い方から、知っておくと便利な応用例まで、短いサンプルコードと丁寧な解説を交えてご紹介します。


 

なぜデータをソートするのか?

 

データをソートする主な理由は以下の通りです。

  • 傾向の把握: 数値データの昇順・降順で並べ替えることで、最大値・最小値や、データの分布の傾向を素早く把握できます。

  • 比較分析: 特定のカテゴリや期間でデータを並べ替えることで、グループ間の比較が容易になります。

  • 可視化の準備: グラフ作成時に、軸の順序を意味のあるものにするためにソートが必要です。

  • データ確認・デバッグ: 特定の条件を満たすデータを見つけやすくしたり、入力ミスがないかを確認したりする際に役立ちます。


 

sort_values()で値に基づいてソートする

 

sort_values()メソッドは、DataFrameやSeriesの特定の列(値)に基づいてデータを並べ替える際に使用します。

 

Seriesをソートする

 

Seriesの要素の値を基準に並べ替えます。デフォルトは昇順(小さい方から大きい方へ)です。

Python
 
import pandas as pd

# サンプルSeriesの作成
s = pd.Series([30, 10, 50, 20, 40])
print("オリジナルSeries:\n", s)

# 昇順でソート
s_sorted_asc = s.sort_values()
print("\n昇順ソート後Series:\n", s_sorted_asc)

# 降順でソート
s_sorted_desc = s.sort_values(ascending=False)
print("\n降順ソート後Series:\n", s_sorted_desc)

解説:

  • s.sort_values(): sの値を昇順に並べ替えます。インデックスも値に合わせて移動します。

  • ascending=False: Falseを指定すると、降順(大きい方から小さい方へ)に並べ替わります。

 

DataFrameをソートする

 

DataFrameでは、どの列の値に基づいてソートするかをby引数で指定します。

Python
 
# サンプルDataFrameの作成
df = pd.DataFrame({
    '商品': ['りんご', 'みかん', 'バナナ', 'りんご'],
    '価格': [100, 120, 80, 110],
    '在庫': [10, 5, 20, 15]
})
print("\nオリジナルDataFrame:\n", df)

# '価格'列を基準に昇順でソート
df_sorted_price = df.sort_values(by='価格')
print("\n'価格'でソート後DataFrame:\n", df_sorted_price)

# '在庫'列を基準に降順でソート
df_sorted_stock = df.sort_values(by='在庫', ascending=False)
print("\n'在庫'でソート後DataFrame:\n", df_sorted_stock)

解説:

  • by='価格': '価格'列の値を基準にDataFrame全体が並べ替えられます。

  • byには文字列(単一の列名)または文字列のリスト(複数の列名)を指定できます。

 

複数の列を基準にソートする

 

複数の列をソートの基準にしたい場合、by引数に列名のリストを渡します。リストの順序がソートの優先順位になります。

Python
 
# '商品'で昇順、次に'価格'で降順にソート
df_multi_sort = df.sort_values(by=['商品', '価格'], ascending=[True, False])
print("\n'商品'昇順、'価格'降順でソート後DataFrame:\n", df_multi_sort)

解説:

  • by=['商品', '価格']: まず'商品'列で並べ替え、もし同じ商品があれば次に'価格'列で並べ替えます。

  • ascending=[True, False]: 各列ごとのソート順を指定します。ここでは'商品'は昇順、'価格'は降順です。


 

sort_index()でインデックスに基づいてソートする

 

sort_index()メソッドは、DataFrameやSeriesのインデックスの値に基づいてデータを並べ替える際に使用します。

 

Seriesのインデックスをソートする

 

Seriesのインデックスを基準に並べ替えます。

Python
 
# インデックスがランダムなSeries
s_idx = pd.Series([10, 20, 30], index=[2, 0, 1])
print("\nオリジナルSeries (インデックス):\n", s_idx)

# インデックスを昇順でソート
s_idx_sorted = s_idx.sort_index()
print("\nインデックス昇順ソート後Series:\n", s_idx_sorted)

# インデックスを降順でソート
s_idx_sorted_desc = s_idx.sort_index(ascending=False)
print("\nインデックス降順ソート後Series:\n", s_idx_sorted_desc)

 

DataFrameのインデックスをソートする

 

DataFrameの行インデックスまたは列インデックスを基準に並べ替えます。

Python
 
# インデックスと列名がランダムなDataFrame
df_idx = pd.DataFrame({
    'A': [1, 2], 'B': [3, 4]
}, index=['row_Y', 'row_X'])
print("\nオリジナルDataFrame (インデックス・列名):\n", df_idx)

# 行インデックスを昇順でソート(デフォルト)
df_idx_sorted_rows = df_idx.sort_index()
print("\n行インデックス昇順ソート後DataFrame:\n", df_idx_sorted_rows)

# 列インデックスを昇順でソート (axis=1)
df_idx_sorted_cols = df_idx.sort_index(axis=1)
print("\n列インデックス昇順ソート後DataFrame:\n", df_idx_sorted_cols)

解説:

  • axis=1: sort_index()axis=1を指定すると、列インデックス(列名)を基準に並べ替えます。


 

注意点: inplace引数と欠損値(NaN)の扱い

 

 

inplace引数

 

sort_values()sort_index()もデフォルトでは新しいSeries/DataFrameを返します。元のオブジェクトを直接変更したい場合は、inplace=Trueを設定します。

Python
 
# 例: inplace=Trueの使用(非推奨とされることが多い)
df_inplace = pd.DataFrame({'Val': [3, 1, 2]})
print("inplace適用前DataFrame:\n", df_inplace)

df_inplace.sort_values(by='Val', inplace=True)
print("\ninplace適用後DataFrame:\n", df_inplace)

解説:

inplace=Trueは元のオブジェクトを上書きするため、注意が必要です。通常は新しい変数に代入する方が安全で推奨されます。

 

欠損値(NaN)の扱い

 

sort_values()でソートする際、欠損値(NaN)はデフォルトで最後に配置されます。na_position引数でこの挙動を制御できます。

Python
 
import numpy as np
s_nan = pd.Series([10, np.nan, 30, 20])

# NaNはデフォルトで最後に配置
s_sorted_nan = s_nan.sort_values()
print("\nNaNを含むSeriesソート後 (デフォルト):\n", s_sorted_nan)

# NaNを最初に配置
s_sorted_nan_first = s_nan.sort_values(na_position='first')
print("\nNaNを含むSeriesソート後 (na_position='first'):\n", s_sorted_nan_first)

解説:

na_position=’first’を指定すると、NaNがソート結果の最初に配置されます。


 

まとめ

 

Pandasのsort_values()sort_index()メソッドは、DataFrameやSeriesのデータを思い通りに並べ替えるための非常に重要なツールです。sort_values()は値に基づいて、sort_index()はインデックスに基づいてソートを行い、ascending引数で昇順・降順を、by引数で複数の列を、axis引数で列インデックスを制御できます。これらのソート機能をマスターすることで、データの探索、分析、可視化の効率と精度を格段に向上させることができるでしょう。