概要
PandasのDataFrameを使ってデータを処理すると、maxやminといったメソッドを用いて簡単に各カラムの最大値や最小値を得ることが出来ます。しかしながら、現時点(pandas ver 1.1.2)では、2番目の最大値や最小値、3番目の最大値や最小値、、、といった値を得る機能は備わっていません。webを探しても、「sortして上位を取ればよい」というような記載は見つかるのですが、DataFrameに対して簡単に処理ができるようなスクリプトは見当たりませんでした。
そこで本記事では、なるべく少ない行数でかけて、かつ以下図のイメージのようにDataFrameの各カラムの上位n番目までの値を得られるようなスクリプトを紹介します。引数を変えることで、最小値を対象としたり、値ではなくインデックスを受け取ったりすることも可能です。
処理スクリプト
以下に示すgetmaxという関数をDataFrameにapplyすることで所望の結果を得ます。各引数の意味は以下の通りです。
- series: pandasのseries
- topnum: 上位何個を得たいか
- getmin: 下位n個を得たい場合はTrue
- 値ではなくindexを得たい場合はTrue
def getmax(series, topnum=3, getmin=False, getindex=False): if getindex is False: series = series.sort_values(ascending=getmin).head(topnum).reset_index(drop=True) series.index += 1 return series else: return series.sort_values(ascending=getmin).head(topnum).index
使用例
まずはsort対象のデータフレームを適当に作成します。
import numpy as np import pandas as pd df = pd.DataFrame(np.random.rand(1000, 10))
getmaxをapplyすると所望の結果を得ることが出来ます。
df.apply(getmax, axis=0, topnum=3)
axis=1にすれば列方向の集約が可能です。topnumも5にしています。
df.apply(getmax, axis=1, topnum=5)
下位4位までを取得します。
df.apply(getmax, axis=0, topnum=4, getmin=True)
値ではなくindexを得ます。(idxmaxの上位n個版に相当)
df.apply(getmax, axis=0, topnum=3, getindex=True)
まとめ
Pandasではmaxやminといったメソッドを用いて簡単に各カラムの最大値や最小値を得ることが出来ますが、2番目の最大値や最小値、3番目の最大値や最小値といった値を得る機能は備わっていません。PandasのDataFrameを対象に、なるべく少ない行数でかけて、かつ各カラムの上位や下位のn番目までの値やindexを得られるようなスクリプトを紹介しました。このような処理をしたいときはちらほらあると思うので、活用してみてください。