【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になります。
基本的な使い方
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}")
解説:
-
s_scores.nlargest(3):s_scoresの中から値が最も大きい3つの要素を、大きい順にソートして返します。インデックスも一緒に取得されます。 -
s_scores.nsmallest(2):s_scoresの中から値が最も小さい2つの要素を、小さい順にソートして返します。
2. DataFrameで上位・下位N個の行を取得
DataFrameに対してnlargest()やnsmallest()を適用すると、特定の列の値を基準に、DataFrame全体の行を上位(下位)N個に絞り込むことができます。
特定の列を基準にDataFrameの上位/下位N行を取得
columns引数に基準となる列名を指定します。
# サンプル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}")
解説:
-
df_products.nlargest(3, '売上'): DataFramedf_productsの中から、'売上'列の値が最も大きい上位3つの行を抽出します。結果は売上順にソートされたDataFrameになります。 -
df_products.nsmallest(2, '利益'):'利益'列の値が最も小さい下位2つの行を抽出します。
複数の列を基準にソートして上位/下位N行を取得
columns引数に列名のリストを渡すことで、複数の列を条件として、その優先順位に従って上位(下位)N行を抽出できます。
# 'カテゴリ'と'売上'を基準に上位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個の要素を選択する際に同率の複数の値が存在する場合、先に現れる行が優先されます。
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=2がID=4より先に現れるため、ID=2が優先されます。 -
欠損値(NaN)は、これらのメソッドではデフォルトで無視されます。
まとめ
Pandasのnlargest()とnsmallest()メソッドは、DataFrameやSeriesから上位(または下位)N個のデータを効率的かつ簡潔に抽出するための非常に強力なツールです。特定の列を基準にトップN行を取得したり、複数の列を条件にランキング付けしたりすることで、データ探索や分析の効率を大幅に向上させることができます。
-
Series:
.nlargest(n)/.nsmallest(n)で直接利用。 -
DataFrame:
.nlargest(n, '基準列名')/.nsmallest(n, '基準列名')で利用。複数列を基準にする場合はリストで指定。 -
重複値やNaNの扱いにも注意。
これらのメソッドをマスターし、あなたのデータから「最も重要な」インサイトを素早く引き出すためのスキルを磨きましょう!



