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 列の最小値 2 と b 列の最小値 1 が返されています。- 重複値 (a 列の 1 と b 列の 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
- 独自のロジックを実装できます。
- 処理速度を最適化できます。
- コード作成の手間がかかります。
- テストとデバッグが必要になります。