【Pandasデータ探索】nlargest()とnsmallest()でトップN個のデータを見つける!🚀


 

データ分析では、全体の最大値や最小値だけでなく、「上位(下位)N個のデータ」を特定したい場面が頻繁にあります。例えば、「売上トップ5の商品」や「最もパフォーマンスが低かった従業員ワースト3」といった情報を素早く抽出したい場合に、この機能は非常に役立ちます。

Pandasの**nlargest()メソッドnsmallest()メソッド**は、DataFrameやSeriesの数値データから、このような上位(または下位)N個のデータを効率的に取得するための強力なツールです。これらのメソッドは、データをソートしてから手動でスライスするよりも、はるかに簡潔で高速な方法を提供します。この記事では、nlargest()nsmallest()の基本的な使い方から、知っておくと便利な応用例まで、短いサンプルコードと丁寧な解説を交えてご紹介します。


 

nlargest()nsmallest()とは?なぜトップNデータが必要なのか?

 

  • nlargest(n): SeriesまたはDataFrameにおいて、最も値が大きい上位n個の要素を返します。

  • nsmallest(n): SeriesまたはDataFrameにおいて、最も値が小さい下位n個の要素を返します。

なぜデータ分析で上位(下位)N個のデータが必要なのでしょうか?

  • パフォーマンス分析: 特定の指標(売上、スコアなど)に基づいて、最も成績の良い/悪い項目を特定し、その要因を分析します。

  • 異常値の発見: 極端に高い値や低い値を持つデータを抽出し、それが異常なデータなのか、あるいは特別な意味を持つのかを調査します。

  • リソース配分: 重要な顧客、高収益の商品、または改善が必要な領域を特定し、リソースを効率的に配分します。

  • データ集約とレポーティング: 大量のデータの中から、主要なトレンドや注目すべきポイントを抽出し、簡潔なレポートを作成します。


 

1. Seriesで上位・下位N個のデータを取得

 

Seriesに対してnlargest()nsmallest()を適用すると、そのSeries内で値が大きい(小さい)順に上位(下位)N個の要素を返します。結果は、値でソートされたSeriesになります。

 

基本的な使い方

 

Python
 
import pandas as pd
import numpy as np

# サンプルSeriesの作成 (社員のテストスコア)
s_scores = pd.Series([85, 92, 78, 95, 88, 70, 98, 82],
                     index=['Aさん', 'Bさん', 'Cさん', 'Dさん', 'Eさん', 'Fさん', 'Gさん', 'Hさん'])
print("元のSeries (スコア):\n", s_scores)

# 上位3つのスコアを持つ人物を取得
top_3_scores = s_scores.nlargest(3)
print(f"\n最高スコア上位3名:\n{top_3_scores}")

# 下位2つのスコアを持つ人物を取得
bottom_2_scores = s_scores.nsmallest(2)
print(f"\n最低スコア下位2名:\n{bottom_2_scores}")

解説:

  1. s_scores.nlargest(3): s_scoresの中から値が最も大きい3つの要素を、大きい順にソートして返します。インデックスも一緒に取得されます。

  2. s_scores.nsmallest(2): s_scoresの中から値が最も小さい2つの要素を、小さい順にソートして返します。


 

2. DataFrameで上位・下位N個の行を取得

 

DataFrameに対してnlargest()nsmallest()を適用すると、特定の列の値を基準に、DataFrame全体の行を上位(下位)N個に絞り込むことができます。

 

特定の列を基準にDataFrameの上位/下位N行を取得

 

columns引数に基準となる列名を指定します。

Python
 
# サンプルDataFrameの作成 (商品別売上と利益)
df_products = pd.DataFrame({
    '商品ID': ['P001', 'P002', 'P003', 'P004', 'P005', 'P006', 'P007', 'P008'],
    '売上': [10000, 15000, 8000, 25000, 12000, 9000, 18000, 20000],
    '利益': [1500, 2000, 1000, 3500, 1800, 1200, 2800, 3000],
    'カテゴリ': ['A', 'B', 'A', 'C', 'B', 'A', 'C', 'B']
})
print("\n元のDataFrame (商品データ):\n", df_products)

# '売上'列を基準に上位3つの商品を取得
top_3_products_by_sales = df_products.nlargest(3, '売上')
print(f"\n売上上位3つの商品:\n{top_3_products_by_sales}")

# '利益'列を基準に下位2つの商品を取得
bottom_2_products_by_profit = df_products.nsmallest(2, '利益')
print(f"\n利益下位2つの商品:\n{bottom_2_products_by_profit}")

解説:

  1. df_products.nlargest(3, '売上'): DataFrame df_productsの中から、'売上'列の値が最も大きい上位3つの行を抽出します。結果は売上順にソートされたDataFrameになります。

  2. df_products.nsmallest(2, '利益'): '利益'列の値が最も小さい下位2つの行を抽出します。

 

複数の列を基準にソートして上位/下位N行を取得

 

columns引数に列名のリストを渡すことで、複数の列を条件として、その優先順位に従って上位(下位)N行を抽出できます。

Python
 
# 'カテゴリ'と'売上'を基準に上位3つの商品を取得
# まずカテゴリでソートされ、次に売上でソートされる
top_3_by_category_sales = df_products.nlargest(3, ['カテゴリ', '売上'])
print(f"\nカテゴリと売上を基準に上位3つの商品:\n{top_3_by_category_sales}")

解説:

nlargest(3, [‘カテゴリ’, ‘売上’])は、まず’カテゴリ’列でソートし(文字列なのでアルファベット順)、次に同じカテゴリ内であれば’売上’列でソートします。結果として、指定された列の組み合わせで最も「大きい」上位3つのレコードが返されます。この挙動はsort_values()と似ています。


 

3. 重複する値の扱いと欠損値(NaN)

 

nlargest()およびnsmallest()は、重複する値がある場合、それらを維持して返します。もしN個の要素を選択する際に同率の複数の値が存在する場合、先に現れる行が優先されます。

Python
 
df_dup = pd.DataFrame({
    'ID': [1, 2, 3, 4, 5],
    '値': [10, 50, 20, 50, 30]
})
print("\n重複値を含むDataFrame:\n", df_dup)

# 上位2つを取得。値'50'が2つあるが、先に現れるID=2の行が優先
top_2_dup = df_dup.nlargest(2, '値')
print("\n重複値を含む上位2つ:\n", top_2_dup)

# NaNの扱い
df_nan = pd.DataFrame({
    'データ': [10, 20, np.nan, 30, 5]
})
print("\nNaNを含むDataFrame:\n", df_nan)

# NaNはデフォルトで無視される
top_2_nan = df_nan.nlargest(2, 'データ')
print("\nNaNを無視した上位2つ:\n", top_2_nan)

解説:

  • nlargest()/nsmallest()は、N個の要素を返す際に、同率の値が複数存在しても、その全てを返そうとします。ただし、N個を超える場合は、DataFrame上での元の出現順序(インデックス順)に基づいて選択されます。上記の例ではID=2ID=4より先に現れるため、ID=2が優先されます。

  • 欠損値(NaN)は、これらのメソッドではデフォルトで無視されます。


 

まとめ

 

Pandasのnlargest()nsmallest()メソッドは、DataFrameやSeriesから上位(または下位)N個のデータを効率的かつ簡潔に抽出するための非常に強力なツールです。特定の列を基準にトップN行を取得したり、複数の列を条件にランキング付けしたりすることで、データ探索や分析の効率を大幅に向上させることができます。

  • Series: .nlargest(n) / .nsmallest(n) で直接利用。

  • DataFrame: .nlargest(n, '基準列名') / .nsmallest(n, '基準列名') で利用。複数列を基準にする場合はリストで指定。

  • 重複値やNaNの扱いにも注意。

これらのメソッドをマスターし、あなたのデータから「最も重要な」インサイトを素早く引き出すためのスキルを磨きましょう!