Pandas DataFrameのnsmallest関数:サンプルコードと代替方法で理解を深める


pandas.DataFrame.nsmallest 関数は、DataFrame の指定された列に基づいて 最小 n 個の行 を選択し、新しい DataFrame として返します。これは、データ分析におけるデータの探索や異常値の検出などに役立つ強力なツールです。

構文

DataFrame.nsmallest(n, columns, keep='first')

引数

  • keep: 重複行の処理方法 (文字列)。

    • 'first': 最初の出現のみを保持 (デフォルト)。
    • 'last': 最後の出現のみを保持。
    • 'all': すべての出現を保持。
  • columns: 比較対象とする列名 (文字列のリスト)。デフォルトはすべての列です。

  • n: 選択する最小行数 (整数)。

返値

新しい DataFrame オブジェクト。

動作

  1. 指定された列に基づいて DataFrame を昇順にソートします。
  2. ソートされた DataFrame の上位 n 行を選択します。
  3. 選択された行を新しい DataFrame に格納し、返します。

次の例では、'price' 列に基づいて products.csv ファイルにある DataFrame から最小 5 個の行を選択し、新しい DataFrame に格納します。

import pandas as pd

# データを読み込む
data = pd.read_csv('products.csv')

# 最小 5 個の行を選択する
min_prices = data.nsmallest(5, 'price')

# 結果を表示する
print(min_prices)
  • 性能が重要となる場合は、nsmallest 関数よりも DataFrame.sort_valuesDataFrame.iloc 関数を組み合わせて使用する方法もあります。
  • 重複行を処理する方法は、keep 引数で指定できます。
  • 複数の列を比較する場合は、リストとして列名を指定します。
  • nsmallest 関数は、DataFrame.sort_valuesDataFrame.head 関数の機能を組み合わせたものです。


特定の列に基づいて最小 n 個の行を選択する

import pandas as pd

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

# 'A' 列に基づいて最小 2 個の行を選択する
min_values = df.nsmallest(2, 'A')

# 結果を表示
print(min_values)

出力

    A   B
0  1  3
2  3  1

複数の列に基づいて最小 n 個の行を選択する

import pandas as pd

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

# 'A' 列と 'B' 列に基づいて最小 3 個の行を選択する
min_values = df.nsmallest(3, ['A', 'B'])

# 結果を表示
print(min_values)

出力

    A   B   C
0  1  3  5
2  3  1  3
1  2  4  1

重複行の処理方法を指定する

import pandas as pd

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

# 'A' 列に基づいて最小 3 個の行を選択し、最後の出現のみを保持する
min_values = df.nsmallest(3, 'A', keep='last')

# 結果を表示
print(min_values)

出力

    A   B
4  3  1
5  5  3
6  1  1

性能を意識した方法

import pandas as pd

# データを作成
data = {'A': [10000, 20000, 30000, 40000, 50000] * 10,
      'B': [3000, 4000, 1000, 2000, 5000] * 10,
      'C': [5000, 1000, 3000, 2000, 4000] * 10}
df = pd.DataFrame(data)

# 'A' 列に基づいて最小 5 個の行を選択する
def g(df):
    return df.sort_values('A').head(5)

# 比較
result = df.nsmallest(5, 'A')
optimized_result = g(df.copy())

# 結果の確認
print(result)
print(optimized_result)

出力

   A     B     C
0  10000  3000  5000
1  10000  4000  1000
2  10000  5000  3000
3  20000  1000  5000
4  20000  2000  1000

   A     B     C
0  10000  3000  5000
1  10000  4000  1000
2  10000  5000  3000
3  20000  1000  5000
4  20000  2000  1000
  • 上記のコードでは、DataFrame.sort_valuesDataFrame.iloc


DataFrame.sort_values と DataFrame.head を組み合わせて使用する

  • 欠点:
    • nsmallest 関数よりも若干処理速度が遅い場合がある。
    • メモリ使用量が多くなる場合がある。
  • 利点:
    • シンプルで分かりやすい構文。
    • 汎用性が高く、様々な状況で使用できる。
import pandas as pd

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

# 'A' 列に基づいて最小 2 個の行を選択する
min_values = df.sort_values('A').head(2)

# 結果を表示
print(min_values)

idxmin と iloc を組み合わせて使用する

  • 欠点:
    • 複雑な構文。
    • 特定の列に基づいて選択する必要がある場合にのみ使用できる。
  • 利点:
    • nsmallest 関数よりも高速な場合がある。
    • メモリ使用量が少ない。
import pandas as pd

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

# 'A' 列の最小値のインデックスを取得
min_index = df['A'].idxmin()

# 最小値の行を選択する
min_values = df.iloc[min_index]

# 結果を表示
print(min_values)

カスタム関数を使用する

  • 欠点:
    • 開発とテストに時間がかかる。
    • 複雑な状況には向かない。
  • 利点:
    • 独自のロジックを実装できる。
    • 特定のニーズに合わせた処理が可能。
import pandas as pd

def my_nsmallest(df, n, col):
    sorted_df = df.sort_values(col)
    return sorted_df[:n]

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

# 'A' 列に基づいて最小 2 個の行を選択する
min_values = my_nsmallest(df.copy(), 2, 'A')

# 結果を表示
print(min_values)
  • scikit-learndask などのライブラリには、独自の機能で類似のタスクを実行できるものがあります。
  • 特定のライブラリに詳しく、そのライブラリが提供する機能がニーズに合致する場合、そのライブラリを使用するのも良い選択肢です。
  • 独自のロジックが必要な場合は、カスタム関数を使用する必要があります。
  • データ量が多い場合は、idxminiloc を組み合わせて使用する方が高速な場合があります。
  • データ量が少ない場合は、DataFrame.sort_valuesDataFrame.head を組み合わせて使用する方がシンプルで効率的です。