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

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

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

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

pandas

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

Q&A

解決済

2回答

479閲覧

Pythonで配列の1行にあるn個の要素から大きい順に3個の値を抽出する

wiz_noise

総合スコア12

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2017/11/17 00:39

###Pythonで配列の1行にあるn個の要素から大きい順に3個の値を抽出する方法

初学者で、以下のようなデータで範囲を指定し、
処理前から処理後を抽出する方法はないかと思い、質問させていただきます。

(処理前)

|S1(文字列)|a|b|c|d|e|f|g|h|S2(文字列)|
|:--:|--:|
|○○○○|1|2|3|4|5|6|7|8|○○○○|
|○○○○|2|4|6|8|10|12|14|16|○○○○|

(処理後)
|S1(文字列)|上位1|上位2|上位3|S2(文字列)|
|:--:|--:|
|○○○○|8|7|6|○○○○|
|○○○○|16|14|12|○○○○|

ahまでは同種の要素で、処理後はカラム名を別に指定したいと考えております。
a
hまでは、同じ値にならない場合と考えております。

拙い質問で申し訳ありませんが、ご教示いただければと思います。
よろしくお願い致します。

###試したこと
最大値を得られますので、
これとfor文を使って、抽出する方法があるかとは思うのですが・・・

###補足情報(言語/FW/ツール等のバージョンなど)
Pythonは3.5.4を使用しています。
Pandasは0.21.0

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

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

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

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

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

guest

回答2

0

ベストアンサー

書いてみました。こんな感じでどうでしょうか。

もう少しシンプルになって欲しいところ・・・

Python

1import pandas as pd 2 3df = pd.DataFrame([['S1_1',1,2,3,4,5,6,7,8,'S2_1'], 4 ['S1_2',2,4,6,8,10,12,14,16,'S2_2']], 5 columns=['S1','a','b','c','d','e','f','g','h','S2']) 6print(df) 7# S1 a b c d e f g h S2 8# 0 S1_1 1 2 3 4 5 6 7 8 S2_1 9# 1 S1_2 2 4 6 8 10 12 14 16 S2_2 10 11rank = df.iloc[:,1:9].apply(lambda s:s.sort_values(ascending=False)[:3].reset_index(drop=True), axis=1) 12rank.columns = ['R1', 'R2', 'R3'] 13res = pd.concat([df['S1'], rank, df['S2']], axis=1) 14 15print(res) 16# S1 R1 R2 R2 S2 17# 0 S1_1 8 7 6 S2_1 18# 1 S1_2 16 14 12 S2_2

投稿2017/11/17 02:07

編集2017/11/17 02:24
magichan

総合スコア15898

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

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

mkgrei

2017/11/17 02:18

細かいかもしれませんが、少しインデックスがずれています。 rank = df.iloc[:,1:8].apply(lambda s:s.sort_values(ascending=False)[:3].res ↓ rank = df.iloc[:,1:9].apply(lambda s:s.sort_values(ascending=False)[:3].res
magichan

2017/11/17 02:21

おっホントだ 結果も間違ってる・・・・ 指摘、有り難うございました。直しておきます。
wiz_noise

2017/11/17 07:05

magicchanさんご回答ありがとうございます。質問に沿った回答で大変助かりました。
guest

0

こんな感じではどうでしょう。

python

1import numpy as np 2import pandas as pd 3 4r = np.random.randint(10, size=(10, 5)) 5df = pd.DataFrame(r) 6 7N = 3 8c = df.loc[0, :].nlargest(N) 9 10print('DataFrame') 11print(df) 12print('FirstRow') 13print(df.loc[0, :]) 14print('LargestNInFirstRow') 15print(c) 16print('NewDataFrame') 17print(df.loc[:, c.index])

投稿2017/11/17 01:03

mkgrei

総合スコア8560

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問