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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

Q&A

解決済

1回答

734閲覧

Dataframe の効率的な処理方法

fpfpfp

総合スコア55

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

0グッド

0クリップ

投稿2021/10/13 05:57

前提・実現したいこと

python で Dataframe に関する処理を実装しています。

既存のDataframeに何らかの評価を行い、

  • 評価に使った列名(要素)
  • 評価結果

を追加するような処理になります。

下記のように2通りの手法で実装できたのですが、どちらも無駄が多いように感じています。

  • 実装1 (copy と concat)
  • 実装2 (melt)

実装1は評価要素の数だけ複製を生成、実装2はwide型のDataframeを介して処理する必要がある。

より適切な手法があれば、ご教示おねがいします。

元データ

Python

1import pandas as pd 2 3df = pd.DataFrame({ 4 'name': ['Alice', 'Bob', 'Charlie'], 5 'param1': [10, 20, 30], 6 'param2': [40, 50, 60], 7 'param3': [60, 20, 60], 8}) 9 10# name param1 param2 param3 11# 0 Alice 10 40 60 12# 1 Bob 20 50 20 13# 2 Charlie 30 60 60 14

実装1

Python

1method_list = ['param1', 'param2', 'param3'] 2 3df_list = [] 4 5for method in method_list: 6 df_temp = df.copy() 7 df_temp['method'] = method 8 df_temp['judge'] = df_temp[method] > 50 9 df_list.append(df_temp) 10 11df_result1 = pd.concat(df_list) 12df_result1.reset_index(drop=True, inplace=True) 13 14 15 16# name param1 param2 param3 variable value 17# 0 Alice 10 40 60 param1 False 18# 1 Bob 20 50 20 param1 False 19# 2 Charlie 30 60 60 param1 False 20# 3 Alice 10 40 60 param2 False 21# 4 Bob 20 50 20 param2 False 22# 5 Charlie 30 60 60 param2 True 23# 6 Alice 10 40 60 param3 True 24# 7 Bob 20 50 20 param3 False 25# 8 Charlie 30 60 60 param3 True 26

実装2

Python

1df_temp = df.copy() 2 3col_dict = {'judge1': 'param1', 'judge2':'param2', 'judge3':'param3'} 4 5for k, v in col_dict.items(): 6 df_temp[k] = df_temp[v] > 50 7 8df_melt = df_temp.melt( 9 id_vars=['name', 'param1', 'param2', 'param3'], 10 value_vars=['judge1', 'judge2', 'judge3']) 11 12df_result2 = df_melt.replace(col_dict) 13

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

Google Colab にて確認

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

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

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

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

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

guest

回答1

0

ベストアンサー

基本は実装1をベースとします。
以下のように評価結果だけのデータを作成し、それを元データに外部結合する方法だと複製も不要で少しは簡潔になるかと思います。
なお、結果行の並びは結合にしたがいname→metho順となりますが、必要に応じてsort_valuesしてください。

Python

1import pandas as pd 2 3df = pd.DataFrame({ 4 'name': ['Alice', 'Bob', 'Charlie'], 5 'param1': [10, 20, 30], 6 'param2': [40, 50, 60], 7 'param3': [60, 20, 60], 8}) 9 10method_list = ['param1', 'param2', 'param3'] 11df_list = [] 12for method in method_list: 13 judge = df[method] > 50 14 df_temp = pd.DataFrame(index=judge.index, data={'method':method, 'judge':judge}) 15 df_list.append(df_temp) 16 17df_judge = pd.concat(df_list) 18df_result1 = df.merge(df_judge, left_index=True, right_index=True, how='outer') 19df_result1.reset_index(drop=True, inplace=True) 20print(df_result1) 21""" 22 name param1 param2 param3 method judge 230 Alice 10 40 60 param1 False 241 Alice 10 40 60 param2 False 252 Alice 10 40 60 param3 True 263 Bob 20 50 20 param1 False 274 Bob 20 50 20 param2 False 285 Bob 20 50 20 param3 False 296 Charlie 30 60 60 param1 False 307 Charlie 30 60 60 param2 True 318 Charlie 30 60 60 param3 True 32"""

投稿2021/10/13 06:57

can110

総合スコア38341

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

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

fpfpfp

2021/10/14 01:41

回答ありがとうございます。以下の2点参考になりました。 ・評価結果だけのデータを作成する ・外部結合する 各種結合方法についての理解がまだ曖昧なので、そのへんをあらためて確認しようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問