Pandas Series.nsmallest 関数:詳細解説


Pandas Series.nsmallest 関数:詳細解説

pandas.Series.nsmallest 関数は、Series オブジェクト内の n 個の最小値を見つけ、昇順に並べた Series オブジェクトを返します。

構文

Series.nsmallest(n, keep='first')

引数

  • n: 取得する最小値の個数。整数型で指定します。
  • keep: 重複値の処理方法を指定します。
    • 'first': 最初に出現した値を保持します(デフォルト)。
    • 'last': 最後に出現した値を保持します。
    • 'all': すべての重複値を保持します。

戻り値

n 個の最小値を含む、昇順に並べられた Series オブジェクト。

import pandas as pd

# サンプルデータを作成
data = {'a': [1, 5, 2, 4, 3], 'b': [4, 3, 5, 1, 2]}
s = pd.Series(data)

# 最小 2 個の値を取得
result = s.nsmallest(2)
print(result)
Output:

a    2
b    1
dtype: int64

説明

  • 上記の例では、s Series オブジェクトから 2 個の最小値を取得しています。
  • keep='first' オプションを使用しているため、a 列の最小値 2b 列の最小値 1 が返されています。
  • 重複値 (a 列の 1b 列の 2) は無視されます。
  • pandas.Series.nsmallest 関数は、sort_values().head(n) よりも効率的に動作します。これは、nsmallest 関数がソート処理を部分的に行うためです。
  • keep オプションを 'all' に設定すると、重複値を含む Series オブジェクトが返されます。
  • nsmallest 関数は、Series オブジェクトだけでなく、DataFrame オブジェクトにも適用できます。


この例では、pandas.Series.nsmallest 関数を使用して、Series オブジェクトから最小 2 個の値を取得します。

import pandas as pd

# サンプルデータを作成
data = {'a': [1, 5, 2, 4, 3], 'b': [4, 3, 5, 1, 2]}
s = pd.Series(data)

# 最小 2 個の値を取得
result = s.nsmallest(2)
print(result)
Output:

a    2
b    1
dtype: int64

例 2:重複値の処理

この例では、keep オプションを使用して、重複値の処理方法を指定します。

import pandas as pd

# サンプルデータを作成
data = {'a': [1, 1, 5, 2, 4, 3], 'b': [4, 3, 5, 1, 2]}
s = pd.Series(data)

# 最小 2 個の値を取得(最初の出現のみ)
result = s.nsmallest(2, keep='first')
print(result)

# 最小 2 個の値を取得(最後の出現のみ)
result = s.nsmallest(2, keep='last')
print(result)

# 最小 2 個の値を取得(すべての出現を保持)
result = s.nsmallest(2, keep='all')
print(result)
Output:

a    1
b    1
dtype: int64

a    1
b    2
dtype: int64

a    1
b    1
b    2
dtype: int64

例 3:DataFrame へ適用

この例では、pandas.Series.nsmallest 関数を DataFrame オブジェクトに適用します。

import pandas as pd

# サンプルデータを作成
data = {'A': [1, 2, 3, 4, 5], 'B': [4, 3, 5, 1, 2], 'C': [5, 2, 4, 3, 1]}
df = pd.DataFrame(data)

# 各列から最小 2 個の値を取得
result = df.nsmallest(2, axis=1)
print(result)
Output:

     A    B    C
0  1  1  1
1  2  1  2
2  3  2  3
3  4  3  4
4  5  5  5
  • 上記の例では、様々な状況で pandas.Series.nsmallest 関数を使用する方法を示しました。


sort_values().head(n) を使用する

最も基本的な代替方法は、sort_values() 関数と head() 関数を組み合わせて使用する方法です。

import pandas as pd

# サンプルデータを作成
data = {'a': [1, 5, 2, 4, 3], 'b': [4, 3, 5, 1, 2]}
s = pd.Series(data)

# 最小 2 個の値を取得
result = s.sort_values().head(2)
print(result)
Output:

a    2
b    1
dtype: int64

この方法は、pandas.Series.nsmallest 関数とほぼ同じ結果を返しますが、以下の点に注意が必要です。

  • ソート処理が毎回行われるため、n が大きい場合やデータ量が多い場合は処理速度が遅くなる可能性があります。
  • 重複値の処理方法を制御できません。デフォルトでは、最後の出現 が優先されます。

np.argmin() と iloc を使用する

NumPy の np.argmin() 関数を使用して、最小値のインデックスを取得し、iloc を使用して対応する値を取得する方法もあります。

import pandas as pd
import numpy as np

# サンプルデータを作成
data = {'a': [1, 5, 2, 4, 3], 'b': [4, 3, 5, 1, 2]}
s = pd.Series(data)

# 最小 2 個の値のインデックスを取得
n = 2
indices = np.argmin(s)[:n]

# 対応する値を取得
result = s.iloc[indices]
print(result)
Output:

a    2
b    1
dtype: int64

この方法は、以下の利点があります。

  • np.argmin() 関数は高速に動作するため、n が大きい場合やデータ量が多い場合でも効率的に処理できます。
  • 重複値の処理方法を制御できます。np.argmin() 関数の return_indices オプションを使用して、最初の出現 のインデックスを取得できます。

ただし、以下の点に注意が必要です。

  • NumPy の np.argmin() 関数を使用するため、Pandas 専用の機能を利用できません。
  • コードが若干複雑になります。

カスタム関数を使用する

特定のニーズに合わせて、カスタム関数を作成することもできます。

import pandas as pd

def nsmallest(series, n, keep='first'):
    """
    Series オブジェクトから最小 n 個の値を取得する関数

    Args:
        series (pd.Series): 対象の Series オブジェクト
        n (int): 取得する最小値の個数
        keep (str): 重複値の処理方法 ('first', 'last', 'all' のいずれか)

    Returns:
        pd.Series: 最小 n 個の値を含む Series オブジェクト
    """

    sorted_series = series.sort_values()
    if keep == 'first':
        return sorted_series.head(n)
    elif keep == 'last':
        return sorted_series.tail(n)
    elif keep == 'all':
        return sorted_series[:n]
    else:
        raise ValueError("Invalid keep option: {}".format(keep))

# サンプルデータを作成
data = {'a': [1, 5, 2, 4, 3], 'b': [4, 3, 5, 1, 2]}
s = pd.Series(data)

# 最小 2 個の値を取得
result = nsmallest(s, 2, keep='first')
print(result)
Output:

a    2
b    1
dtype: int64
  • 独自のロジックを実装できます。
  • 処理速度を最適化できます。
  • コード作成の手間がかかります。
  • テストとデバッグが必要になります。