pandas
のDataFrame
で最大値・最小値を検索する方法を紹介します。
pandas
には、便利な機能がたくさんありますが、初めはちょっとした操作も難しいものです。
例えば、次のような処理で困ってしまうことも:
- 行・列の最大値・最小値はどうやって取得すればいいの?
- 最大値・最小値が、どの行・列にあるか知りたい!
そこで、この記事では次の内容をわかりやすい図解付きで解説していきます:
- 各行・列の最大値・最小値を取得
- 最大値・最小値の行・列を取得
- n番目に大きい・小さい値を取得
最大値・最小値関連の処理の基本を覚えて、pandas
マスターを目指しましょう!
- 最大値・最小値関連のメソッドまとめ
- DataFrameの統計値をまとめて出力|df.describe()
- 最大値・最小値を取得
- 最大値・最小値の行・列を取得
- n番目に大きい・小さい値を取得
- おわりに|padans関連おススメ追加コンテンツ
最大値・最小値関連のメソッドまとめ
DataFrame
の最大値・最小値関連のメソッドを下表に整理しています。
操作内容 | 最大値 | 最小値 | 行方向で集計する方法 |
---|---|---|---|
統計値をまとめて出力 | df. describe() の出力の一部 |
df. describe() の出力の一部 |
df を転置後実行df.T.describe() |
最大値・最小値を出力 | df.max() |
df.min() |
引数でaxis=1 を指定 |
最大値・最小値位置のラベル名を出力 | df.idxmax() |
df.idxmin() |
引数でaxis=1 を指定 |
n 番目に大きい・小さい値 |
df[列名].nlargest(n) |
df[列名].nsmallest(n) |
df.loc[行名] で行を抽出後実行df.loc[行名].nlargest(n) |
デフォルトでは、最大値・最小値のメソッドはDataFrame
の各列に対して実行されます。
各行の最大値・最小値を確認したい場合には、転置したり、引数でaxis=1
を指定したりします。
以下では、次のDataFrame
を例にして、各メソッドをより詳しく解説していきます。
import pandas as pd
import numpy as np
data = {"Data0":[1, 6, 8, np.nan],
"Data1":[4, 2, 7, np.nan],
"Data2":[9, 5, 3, np.nan], }
df = pd.DataFrame(data, index = pd.Index(["Ind0", "Ind1", "Ind2", "Ind3"], name="Ind"))
最終行に欠損値NaN
を仕込んでいるのは、欠損値の処理も確認するためです。
DataFrameの統計値をまとめて出力|df.describe()
df.describe()
メソッドを使用すると、列毎の基本統計量がDataFrame
で出力されます。
出力される基本統計量一覧は次の通りです:
ラベル名 | 内容 |
---|---|
count |
データ数 |
mean |
平均値 |
std |
標準偏差 |
max |
最大値 |
75% |
75パーセンタイル |
50% |
50パーセンタイル(中央値) |
25% |
25パーセンタイル |
min |
最小値 |
この中に最大値・最小値も含まれているので、簡易的に確認する際にはdf.describe()
も便利です。
基本統計量の計算時、欠損値は無視されます。
df.describe()
上手の結果のように、デフォルトでは行方向で集計されます。
列方向に集計したい場合には、df.T
で転置してからdescribe()
メソッドを使用します。
df.T.describe()
最大値・最小値を取得
各行の最大値・最小値を取得したい場合には、df.max()
, df.min()
メソッドを使用します。
デフォルトでは、行方向に最大値・最小値を集計します。
列方向に集計したい場合には、引数axis=1
を指定します。
最大値 | 最小値 | |
---|---|---|
行方向 | df.max() |
df.min() |
列方向 | df.max(axis=1) |
df.min(axis=1) |
結果はSeries
で出力されます。
df.max()
を例にサンプルコードを紹介します。df.min()
も同様です。
# デフォルトでは行方向に探索
df.max()
# 出力結果:Series
#
# Data0 8.0
# Data1 7.0
# Data2 9.0
# dtype: float64
# axis=1で、列方向に探索
df.max(axis=1)
# 出力結果:Series
#
# Ind
# Ind0 9.0
# Ind1 6.0
# Ind2 8.0
# Ind3 NaN
# dtype: float64
デフォルトでは、欠損値を除外して、最大値・最小値を評価します。
ただしInd3
行のように、全てのデータが欠損の場合には欠損値が出力されます。
最大値・最小値の行・列を取得
各行の最大値・最小値を取得したい場合には、df.idxmax()
, df.idxmin()
メソッドを使用します。
デフォルトでは、行方向に最大値・最小値の探索し、その行のインデックス名を集計します。
idx
はindex
の略称です。
列方向に集計したい場合には、引数axis=1
を指定します。
最大値のラベル | 最小値のラベル | |
---|---|---|
行方向 | df.idxmax() |
df.idxmin() |
列方向 | df.idxmax(axis=1) |
df.idxmin(axis=1) |
結果はSeries
で出力されます。
df.idxmax()
を例にサンプルコードを紹介します。df.idxmin()
も同様です。
# デフォルトでは行方向に探索
df.idxmax()
# 出力結果:Series
#
# Data0 Ind2
# Data1 Ind2
# Data2 Ind0
# dtype: object
# axis=1で、列方向に探索
df.idxmax(axis=1)
# 出力結果:Series
#
# Ind
# Ind0 Data2
# Ind1 Data0
# Ind2 Data0
# Ind3 NaN
# dtype: object
デフォルトでは、欠損値を除外して、最大値・最小値を評価します。
ただしInd3
行のように、全てのデータが欠損の場合には欠損値が出力されます。
【トラブル事例】最大値・最小値が複数ある場合の対応
最大値・最小値が重複している場合、df.idxmax()
, df.idxmin()
は、一番上の行名のみを返します。
次のDataFrame
を例に挙動を確認してみます。
df.idxmax()
# 出力結果
# Data0 Ind0
# Data1 Ind1
# Data2 Ind2
# dtype: object
例えば、"Data0"
列は"Ind0"
と"Ind2"
の2行が最大値にも関わらず、"Ind0"
しか返されていません。
こういった場合は、素直に各列の最大値・最小値を検索して、行名を出力すると良いです。
実際に"Data0"
列の最大値行名を出力してみます。
df.loc[ df["Data0"] == df["Data0"].max(), :].index.tolist()
# ['Ind0', 'Ind2']
上の方法では、次の処理を一行で記述しています。
- 最大値の値を取得|
df["列名"].max()
- 値が最大値と一致する行を抽出|
df.loc[ df["列名" == df["列名"].max(), :]
- インデックスをリスト化|
df.loc[ df["列名"] == df["列名"].max(), :] .index.tolist()
こういったデータ探索とインデックス操作の合わせ技ができるとpandas
が楽しくなってきます。
インデックス操作は次の記事でも解説しています。
n番目に大きい・小さい値を取得
特定の行・列を指定してnlargest()
, nsmallest()
メソッドを使用すると便利です。
- 大きい方から
n
番目まで出力:df[columns].nlargest(n)
- 小さい方から
n
番目まで出力:df[columns].nsmallest(n)
それぞれcolumns
列を降順/昇順にソートして、上からn
個のデータを返します。
df["Data0"].nlargest(3)
# 出力結果
# Ind
# Ind2 8.0
# Ind1 6.0
# Ind0 1.0
# Name: Data0, dtype: float64
df["Data0"].nsmallest(3)
# 出力結果
# Ind
# Ind0 1.0
# Ind1 6.0
# Ind2 8.0
# Name: Data0, dtype: float64
n
番目の値のみを取得したい場合には、インデックスで[-1]
を指定すればOKです。
n = 3
# n番目に大きい値
df["Data0"].nlargest(3)[-1]
# 1.0
# n番目に小さい値
df["Data0"].nsmallest(n)[-1]
# 8.0
行方向に探索したい場合は、df.loc[]
で行を指定してnlargest(),
nsmallest()
メソッドを使用すれば良いですね。
n = 3
df.loc["Ind0"].nlargest(n)[-1]
# 4.0
df.loc["Ind0"].nsmallest(n)[-1]
# 9.0
おわりに|padans関連おススメ追加コンテンツ
今回はpandas
の最大値・最小値関連のメソッドについて紹介しました。
pandas
は便利すぎて操作方法がわかりにくいことがよくあります…。
結局はコツコツ学ぶのが、pandas
マスターの近道ですよね!≫【ブログカテゴリー:pandas】
Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。
気楽にツイートしているので、気軽にフォローしてください!