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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

3回答

4305閲覧

「DataFrame」indexごとの, 上位N個の列を抽出したい

surpass

総合スコア3

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/09/02 20:54

DataFrameのindexごとの, 上位N個の列を抽出したい

df =

    INDEX      番号 平均
201907010601 4 0.411331
201907010601 16 0.472256
201907010601 15 0.758492
201907010601 10 0.704865
201907010601 11 0.722583
201907010601 7 0.502218
201907010601 5 0.422376
201907010601 9 0.142984
201907010601 13 0.166259
201907010601 1 0.063561
201907010601 3 0.170293
201907010601 8 0.105570
201907010601 14 0.186378
201907010601 12 0.058321
201907010601 6 0.103821
201907010601 2 0.241742
201905010402 2 0.470611
201905010402 8 0.783678
201905010402 1 0.298781
201905010402 15 0.302518
201905010402 7 0.710182
201905010402 4 0.175024
201905010402 11 0.402872
201905010402 5 0.463226
201905010402 13 0.373702
201905010402 9 0.043652
201905010402 6 0.329344
201905010402 3 0.331674
201905010402 12 0.203614
201905010402 10 0.094564
201905010402 16 0.200508
201905010402 14 0.093363
201907010606 1 0.794446
201907010606 6 0.801182
201907010606 5 0.849760
201907010606 4 0.804972
201907010606 15 0.240848
201907010606 16 0.273469
201907010606 10 0.327639
201907010606 2 0.409137
201907010606 9 0.183374
201907010606 12 0.485936
201907010606 3 0.258582
201907010606 8 0.786969
201907010606 13 0.323141
201907010606 7 0.170900
201907010606 14 0.166577
201907010606 11 0.029370
201907010604 14 0.773029
201907010604 11 0.659245
201907010604 5 0.572293
201907010604 7 0.834579
201907010604 6 0.235780
201907010604 2 0.217652
201907010604 13 0.684847
201907010604 3 0.254697
201907010604 4 0.404180
201907010604 12 0.215965
201907010604 9 0.409363
201907010604 1 0.362527
201907010604 10 0.367208

発生している問題

上記のような, DataFrameからINDEXごとに「平均」の高い上位N個の列を抽出したいのですが, やり方がわかりません.

理想は, 「平均」の上位3個をINDEXごとに抽出して,
df =

    INDEX      番号 平均
201907010601 15 0.758492
201907010601 10 0.704865
201907010601 11 0.722583

201905010402 2 0.470611
201905010402 8 0.783678
201905010402 7 0.710182

201907010606 6 0.801182
201907010606 5 0.849760
201907010606 4 0.804972

201907010604 14 0.773029
201907010604 11 0.659245
201907010604 7 0.834579

このような出力にしたいと考えています.

試したこと

INDEXごとの処理だということで, groupby(level=0).head(N)のように, 処理するのかと考えたのですが, sortや上位N個の抽出ができませんでした.

出力の結果は, sortができていなくても, 上位N個が抽出できていれば大丈夫です.

素人質問で申し訳ありませんが, 御回答よろしくお願いいたします.

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

先にsortしてから、groupbyして、headすればいいです。

python

1import pandas as pd 2 3df = pd.DataFrame( 4 {'番号': [4, 16, 15, 10, 11, 7, 5, 9, 13, 1, 3, 8, 14, 12, 6, 2, 2, 8, 1, 15, 7, 4, 11, 5, 13, 9, 6, 3, 12, 10, 16, 14, 1, 6, 5, 4, 15, 16, 10, 2, 9, 12, 3, 8, 13, 7, 14, 11, 14, 11, 5, 7, 6, 2, 13, 3, 4, 12, 9, 1, 10], 5 '平均': [0.411331, 0.472256, 0.758492, 0.704865, 0.722583, 0.502218, 0.422376, 0.142984, 0.166259, 0.063561, 0.170293, 0.10557, 0.186378, 0.058321, 0.103821, 0.241742, 0.470611, 0.783678, 0.298781, 0.302518, 0.710182, 0.175024, 0.402872, 0.463226, 0.373702, 0.043652, 0.329344, 0.331674, 0.203614, 0.094564, 0.200508, 0.093363, 0.794446, 0.801182, 0.84976, 0.804972, 0.240848, 0.273469, 0.327639, 0.409137, 0.183374, 0.485936, 0.258582, 0.786969, 0.323141, 0.1709, 0.166577, 0.02937, 0.773029, 0.659245, 0.572293, 0.834579, 0.23578, 0.217652, 0.684847, 0.254697, 0.40418, 0.215965, 0.409363, 0.362527, 0.367208]}, 6 index=[201907010601, 201907010601, 201907010601, 201907010601, 201907010601, 201907010601, 201907010601, 201907010601, 201907010601, 201907010601, 201907010601, 201907010601, 201907010601, 201907010601, 201907010601, 201907010601, 201905010402, 201905010402, 201905010402, 201905010402, 201905010402, 201905010402, 201905010402, 201905010402, 201905010402, 201905010402, 201905010402, 201905010402, 201905010402, 201905010402, 201905010402, 201905010402, 201907010606, 201907010606, 201907010606, 201907010606, 201907010606, 201907010606, 201907010606, 201907010606, 201907010606, 201907010606, 201907010606, 201907010606, 201907010606, 201907010606, 201907010606, 201907010606, 201907010604, 201907010604, 201907010604, 201907010604, 201907010604, 201907010604, 201907010604, 201907010604, 201907010604, 201907010604, 201907010604, 201907010604, 201907010604]) 7 8df = df.sort_values('平均', ascending=False).groupby(level=0).head(3).sort_index() 9# 番号 平均 10# 201905010402 8 0.783678 11# 201905010402 7 0.710182 12# 201905010402 2 0.470611 13# 201907010601 15 0.758492 14# 201907010601 11 0.722583 15# 201907010601 10 0.704865 16# 201907010604 7 0.834579 17# 201907010604 14 0.773029 18# 201907010604 13 0.684847 19# 201907010606 5 0.849760 20# 201907010606 4 0.804972 21# 201907010606 6 0.801182

投稿2020/09/03 00:15

編集2020/09/03 00:45
bsdfan

総合スコア4794

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

surpass

2020/09/03 17:45

御回答ありがとうございます!参考にさせていただきます!
guest

0

結果を複数のデータフレームとして出力したいなら、
以下のようにするとできると思います。

Python

1for (index, group) in df.groupby('INDEX'): 2# print('index = {}'.format(index), end='\n\n') 3 print(group.nlargest(n=3, columns='平均', keep='first')) 4 print('')

イメージ説明

投稿2020/09/03 00:07

autumn_nsn

総合スコア335

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

surpass

2020/09/03 17:44

御回答ありがとうございます! nlargestは知りませんでした. 複数で分ける場合があれば参考にさせていただきます! ありがとうございました!
guest

0

ベストアンサー

rankを使われてはいかがでしょうか。

python3

1df = df[df.groupby(["INDEX"])["平均"].rank(ascending=False)<=3]

投稿2020/09/02 23:59

編集2020/09/03 00:39
jeanbiego

総合スコア3966

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

surpass

2020/09/03 17:42

御回答ありがとうございます!まさにやりたかったことです! rank付けの後に, 上位を抜き出せばよかったのですね!ありがとうございました!
surpass

2020/09/07 22:08

さらにINDEX内で, sortしたものを出力する場合, どのような解決方法が考えられるでしょうか?
jeanbiego

2020/09/07 22:22

どういった内容でしょうか。 なお、この質問と違う内容の質問である場合は、新しく質問を立てててください。
surpass

2020/09/07 22:32

失礼いたしました. 新しく質問を立てさせていただきます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問