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

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

新規登録して質問してみよう
ただいま回答率
85.50%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

pandas

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

Q&A

解決済

2回答

10833閲覧

Columnの名前を変更する(Pythonで配列の1行にあるn個の要素から大きい順に3個の値を抽出する)

wiz_noise

総合スコア12

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2017/11/21 04:59

初学者で、以下のようなデータで範囲を指定し、
カラム名を表示し、集団のTOP3の値を表示するプログラムを考えています。

処理前から処理後を抽出する方法はないかと思い、質問させていただきます。

【処理前】:入力イメージ

|A|B|C|D|E|F|G|H|I|J|
|:--|:--:|--:|
|1|2|3|4|5|6|7|8|9|10|
|8|4|5|1|3|2|7|6|10|9|
|7|5|9|10|2|6|1|8|3|4|
|2|4|6|8|10|1|3|5|9|7|

①10個の同じ要素の比較を行います。(値は乱数です。またこれらは行内で同じ値はないものとします。)
値の大きい順に3個の要素を取り出します。(※)

ABC
1098
IJA
1098
DCH
1098
EID
1098

②値の大きい順にカラム名を'1st','2nd','3rd'としてそれぞれを表します。

【処理後】

1st2nd3rd
1098
1098
1098
1098

試したこと

--変更前のコード import numpy as np import pandas as pd --ここで乱数を生成 r = np.random.randint(10, size=(10, 5)) df = pd.DataFrame(r) --最大値からN個抽出(②の一部です。) N = 3 top = df.loc[0, :].nlargest(N) top3 = df.loc[:,top.index]

入力以降で、カラム名を変更することを考えております(入力後はどのタイミングでも良いです。)

カラム名をRenameは、

df_new = df.rename(columns={'A': 'a'}, inplace=True)

のように変更できることは、調べてわかったのですが、
【処理前】のどの列の要素がどのような値になるかがわからず、
【処理後】のような表を得るのに良い方法がないかと質問させていただいた次第です。

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

補助情報

Pythonは3.5.4を使用しています。
Pandasは0.21.0

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんな感じでよいですか?

なんかこれ、最近書いた気がする・・

Python

1import pandas as pd 2import numpy as np 3 4r = np.random.randint(10, size=(5, 10)) 5df = pd.DataFrame(r, columns=['A','B','C','D','E','F','G','H', 'I', 'J']) 6print(df) 7# A B C D E F G H I J 8# 0 2 0 3 2 0 7 2 0 8 1 9# 1 4 4 5 9 6 5 1 5 7 9 10# 2 3 6 9 5 1 9 0 2 5 1 11# 3 4 1 0 9 2 2 4 8 2 6 12# 4 9 1 3 8 6 8 0 8 6 7 13 14N = 3 15rank_df = df.apply(lambda s:s.sort_values(ascending=False)[:N].reset_index(drop=True), axis=1) 16rank_df.columns = ['1st', '2nd', '3rd'] 17 18print(rank_df) 19# 1st 2nd 3rd 20# 0 8 7 3 21# 1 9 9 7 22# 2 9 9 6 23# 3 9 8 6 24# 4 9 8 8

投稿2017/11/21 05:23

編集2017/11/21 05:26
magichan

総合スコア15898

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

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

mkgrei

2017/11/21 05:26

既視感がありますね。
magichan

2017/11/21 05:30

流行なのかな? あと、nlargest() 使うと rank_df = df.apply(lambda s:s.nlargest(3).reset_index(drop=True), axis=1) ですね
mkgrei

2017/11/21 05:43

やり方は一通りではないということで少し気になっていることがあります。 pandasを使用するとapplyやnlargestなどいろいろなやり方があるかと思います。 インスタンスのコピーなどの、実行速度やメモリの観点からのベストプラクティスというのはあるのでしょうか? 実際にpandasが何をやっているのか、ソースコードを読めばわかることですが、もしご存知でしたら、教えていただけると幸いです。 もしかしたら、バージョン次第で実装が変わって、答えも1つじゃないかもしれませんが。
magichan

2017/11/21 12:29

残念ながら、普段そこまで厳密に処理の取捨選択をしておりませんね。(お役にたてずにすみません)。しいて言えば Slice/Indexing の使用 > DataFrame(or Series)のメソッドを使用 > Apply()処理 > ループ処理(iterrows) の順で処理を選択していることぐらいでしょうか。
YouheiSakurai

2017/11/21 13:25

すごい、全然読めない。。。
guest

0

https://stackoverflow.com/questions/11346283/renaming-columns-in-pandas

df.columns = [“1st”, “2nd”, “3rd”]
ということでしょうか?

投稿2017/11/21 05:25

mkgrei

総合スコア8560

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問