Pandasデータフレームの行ごとのN個の最大/最小値の列名を取得

Get column names for the N Max/Min values per row in Pandas – StackOverflow

numpy.argpartitionがリーズナブルチョイス.こういう処理をする為の関数であって,他の選択肢はないと言っても過言ではない位.汎用性があるし,最も時空間効率の良い方法.

import io
import pandas as pd
import numpy as np


def get_col_minmax_nth(df, N=2):
    a, col = df.values, df.columns.values
    idx = np.argpartition(a, N, 1)
    b = np.concatenate((col[idx][:, -N:], col[idx][:, :N]), 1)
    colname = [f'{i}{j}' for i in ['Max', 'Min'] for j in range(1, N+1)]
    return pd.DataFrame(b, columns=colname)


strings = """a     b     c     d     e
1.2   2     0.1   0.8   0.01
2.1   1.1   3.2   4.6   3.4
0.2   1.9   8.8   0.3   1.3
3.3   7.8   0.12  3.2   1.4"""
df = pd.read_csv(io.StringIO(strings), sep='\s+')
print(df, end='\n\n') # display(df)

df2 = get_col_minmax_nth(df)
res = pd.concat((df, df2), 1)
print(res, end='\n\n')
     a    b     c    d     e
0  1.2  2.0  0.10  0.8  0.01
1  2.1  1.1  3.20  4.6  3.40
2  0.2  1.9  8.80  0.3  1.30
3  3.3  7.8  0.12  3.2  1.40

     a    b     c    d     e Max1 Max2 Min1 Min2
0  1.2  2.0  0.10  0.8  0.01    b    a    e    c
1  2.1  1.1  3.20  4.6  3.40    d    e    b    a
2  0.2  1.9  8.80  0.3  1.30    b    c    a    d
3  3.3  7.8  0.12  3.2  1.40    a    b    c    e
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください