質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.23%

pandasでの最大値集計の方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 3,479

papi_tokei

score 101

前提・実現したいこと

現在pandasを少し勉強しています.
その中で,行ごとの最大値を出力したいと考えています.

該当のソースコード

例えば,下記のソースの場合ですと,一行目の最大値はC列,二行目の最大値はC列...といった具合に集計したいです.

import numpy as np
import pandas as pd
df = pd.DataFrame([[1,4,7],[2,5,8],[3,6,9]],columns = list("abc"))


作成したデータは以下のようになると思います.

a b c
1 4 7
2 5 8
3 6 9

希望する出力結果としては,以下の表になります.

a b c 集計結果
1 4 7 c
2 5 8 c
3 6 9 c

集計結果の列には,その行を集計して,最大値を含む列を追加していきたいです.
例えば,一行目ですと,a列は1でb列は4でc列は7なので,最大値を含む列はc列なので,集計結果にはc列を追加するということです.

出来れば,一行ずつFor文で出力したいです.
少し調べましたが,基本的には列の処理しか出てこなかったので,
質問させていただきました.
最悪,一行ずつ二重For文でもいいのですが,スマートな方法などあれば教えていただきたいです.

アドバイスいただければ幸いです.
よろしくお願いいたします.

補足情報(言語/FW/ツール等のバージョンなど)

Python3
Pandas

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

一般的に最大値のを列(C列)追加するには

import pandas as pd
df = pd.DataFrame([[1,4,7],[2,5,8],[3,6,9]],columns = list("abc"))
df['C'] = df.max(axis=1)

のように記述します。

出来れば,一行ずつFor文で出力したいです.

個人的には上記の方法をお勧めしますが、どうしても行毎にループを回したいのであればDataFrame.iterarows()を使って

import pandas as pd
df = pd.DataFrame([[1,4,7],[2,5,8],[3,6,9]],columns = list("abc"))
for index, row in df.iterrows():
    df.ix[index, 'C'] = max(row)

でどうでしょうか。


回答の修正

最大値があるラベルを求めたい場合は、Series.argmax()を使用するとよいと思います

import pandas as pd
df = pd.DataFrame([[1,4,7],[2,5,8],[3,6,9]],columns = list("abc"))

for index, row in df.iterrows():
    df.ix[index, 'RES'] = row.argmax()
print(df)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/20 14:16

    回答いただきありがとうございます.
    また,返答が遅くなってしまい申し訳ありません.
    確認いたしましたが,ご提示ただいた方法は,最大値を追加する方法だと思います.
    最大値ではなく,最大値を含む列(ラベル)を求めたいです.
    この行の最大値はc列,この行の最大値はa列といったように集計をしたいです.
    私の説明不足で,お手数をおかけして申し訳ありません.
    質問をもう少しわかりやすく修正いたしますので,そちらもご確認いただければ幸いです.

    キャンセル

  • 2017/08/20 21:51

    スミマセン。
    質問を勘違いしておりました。
    回答を修正しましたので確認ください。

    キャンセル

  • 2017/08/21 13:44

    私の実現したいことが完璧に再現できました.
    ありがとうございます.

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる