テーマ、知りたいこと
下記の表からデータを読み取って
データ整形を行いたいのですが、書き方がわかりません。
背景、状況
下記では
ABCDカラムに各数値が入っています
これらは不浮小数点型で入っています。
1位、2位、3位、4位には各ABCDの値が大きい順で格納されています。
| NO | A | B | C | D | 1位 | 2位 | 3位 | 4位 |
|---|---|---|---|---|---|---|---|---|
| 1 | 1.12 | 3.0 | 3.3 | 2.0 | 3.3 | 3.0 | 2.0 | 2.0 |
| 2 | 2.1 | 2.25 | 5.0 | 2.0 | 5.0 | 2.25 | 2.1 | 2.0 |
| 3 | 1.0 | 2.0 | 3.5 | 4.0 | 4.0 | 3.5 | 2.0 | 1.0 |
この表から
1位のカラム名と
1位ー2位 2位ー3位 3位ー4位の間で1.0以下のものを下記のような形で取り出したい
| No | 名 | 値 |
|---|---|---|
| 1 | C | 3.3 |
| 1 | B | 3.0 |
| 2 | C | 5.0 |
| 3 | D | 4.0 |
| 3 | D | 3.5 |
下記のように進めていますが、
データの抽出が出来ずに困っています。
プログラムについて修正若しくはアドバイスを頂けますでしょうか。
python
1import pandas as pd 2 3# データフレームの作成4df = pd.DataFrame({5 'A': [1.12, 2.1, 1.0],6 'B': [3.0, 2.25, 2.0],7 'C': [3.3, 5.0, 3.5],8 'D': [2.0, 2.0, 4.0],9 '1位': [3.3, 5.0, 4.0],10 '2位': [3.0, 2.25, 3.5],11 '3位': [2.0, 2.1, 2.0],12 '4位': [2.0, 2.0, 1.0]13})14 15# 結果を格納するためのリスト16results = []17 18# 各行に対して処理を行う19for i, row in df.iterrows():20 # 1位のカラム名を取得する21 rank_1_col = df.columns[row[['1位', '2位', '3位', '4位']].argmax()]22 23 # 1位-2位、2位-3位、3位-4位の間で1.0以下のものを取り出す24 if row[rank_1_col] - row['2位'] <= 1.0:25 results.append({'No': i+1, '名': df.columns[row[['2位', '3位', '4位']].argmax()], 26 '値': row[row[['2位', '3位', '4位']].argmax()]})27 28# 結果をデータフレームに変換する29results_df = pd.DataFrame(results)30 31# 結果を表示する32results_df

0 コメント