Pandas Seriesのインデックスをソートする方法:pandas.Series.sort_index 解説


Pandas Seriesのインデックスをソートする方法:pandas.Series.sort_index 解説

基本的な使い方

import pandas as pd

# データ作成
s = pd.Series([5, 3, 1, 2, 4], index=['e', 'c', 'a', 'b', 'd'])

# インデックスでソート
s_sorted = s.sort_index()
print(s_sorted)

このコードを実行すると、以下の出力が得られます。

a    1
b    2
c    3
d    4
e    5
dtype: int64

上記の通り、sort_index はデフォルトで昇順ソートを行います。

降順ソート

降順ソートするには、ascending オプションを False に設定します。

s_sorted = s.sort_index(ascending=False)
print(s_sorted)
e    5
d    4
c    3
b    2
a    1
dtype: int64

元のSeriesを置き換える

inplace オプションを True に設定すると、元のSeriesがソート結果で置き換えられます。

s.sort_index(inplace=True)
print(s)
a    1
b    2
c    3
d    4
e    5
dtype: int64
  • level オプション:階層化インデックスをソートするレベルを指定します。
  • na_position オプション:欠損値 (NaN) の扱い方を指定します。'first' は先頭に欠損値を集め、'last' は最後に欠損値を集めます。


import pandas as pd
import numpy as np

np.random.seed(10)
data = np.random.randint(1, 100, 5)
s = pd.Series(data, index=['a', 'b', 'c', 'd', 'e'])

print(s.sort_index())
a    11
b    45
c    63
d    78
e    99
dtype: int64

降順にソートする

print(s.sort_index(ascending=False))
e    99
d    78
c    63
b    45
a    11
dtype: int64
s.sort_index(inplace=True)
print(s)
a    11
b    45
c    63
d    78
e    99
dtype: int64

階層化インデックスをソートする

import pandas as pd

# データ作成
index = pd.MultiIndex.from_tuples([('A', 1), ('A', 2), ('B', 1), ('B', 2)],
                                 names=('Group', 'Number'))
data = [1, 2, 3, 4]
s = pd.Series(data, index=index)

print(s.sort_index(level='Group'))
A 1    1
   2    2
B 1    3
   2    4
dtype: int64

欠損値の扱い方を指定する

import pandas as pd

# データ作成
data = [1, 2, np.nan, 4, 5]
s = pd.Series(data, index=['a', 'b', 'c', 'd', 'e'])

print(s.sort_index(na_position='first'))
c    NaN
a    1
b    2
d    4
e    5
dtype: float64

ソートアルゴリズムを指定する

import pandas as pd

# データ作成
data = [7, 1, 3, 2, 6]
s = pd.Series(data, index=['a', 'b', 'c', 'd', 'e'])

print(s.sort_index(kind='mergesort'))
a    1
b    2
c    3
d    6
e    7
dtype: int64


pandas.Series.sort_index の代替方法

sort_values メソッド

sort_values メソッドは、Series の値に基づいてソートする際に役立ちます。 インデックスだけでなく、値に基づいてソートしたい場合は、この方法がより適切です。

import pandas as pd

# データ作成
s = pd.Series([5, 3, 1, 2, 4], index=['e', 'c', 'a', 'b', 'd'])

# 値でソート
s_sorted = s.sort_values()
print(s_sorted)
a    1
b    2
c    3
d    4
e    5
dtype: int64

利点:

  • 値に基づいてソートできる
  • 降順ソート、欠損値の扱い方など、多くのオプションが利用可能

欠点:

  • インデックスに基づいてソートするには、index オプションを指定する必要がある

Numpy 配列としてソート

numpy.sort 関数を用いて Series のデータを Numpy 配列に変換し、ソートしてから Series に戻す方法もあります。 この方法は、メモリ使用量が少ない場合に役立ちます。

import pandas as pd
import numpy as np

# データ作成
s = pd.Series([5, 3, 1, 2, 4], index=['e', 'c', 'a', 'b', 'd'])

# Numpy 配列に変換してソート
data = s.to_numpy()
np.sort(data)
s_sorted = pd.Series(data, index=s.index)

print(s_sorted)
a    1
b    2
c    3
d    4
e    5
dtype: int64
  • メモリ使用量が少ない
  • sort_indexsort_values メソッドほど柔軟ではない
  • インデックスラベルが失われる可能性がある

カスタム比較関数を使用する

sort_index または sort_values メソッドに key オプションを指定して、カスタム比較関数を使用することもできます。 この方法は、複雑なソート条件を処理する必要がある場合に役立ちます。

import pandas as pd

# データ作成
s = pd.Series([5, 3, 1, 2, 4], index=['e', 'c', 'a', 'b', 'd'])

# カスタム比較関数
def custom_sort(x):
    return x[1] * 10 + x[0]

# カスタム比較関数を使用してソート
s_sorted = s.sort_index(key=custom_sort)
print(s_sorted)
a    1
b    2
c    3
d    4
e    5
dtype: int64
  • 複雑なソート条件を処理できる
  • コードが煩雑になる可能性がある

上記以外にも、idxmaxidxmin などのメソッドを使って特定の値に基づいてソートしたり、lociloc スライシングを使用して特定のインデックスに基づいてソートしたりする方法もあります。