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

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

ただいまの
回答率

87.49%

Dataframe の効率的な処理方法

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 89

score 4

前提・実現したいこと

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

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

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

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

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

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

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

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

元データ

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie'],
    'param1': [10, 20, 30],
    'param2': [40, 50, 60],
    'param3': [60, 20, 60],
})

#    name    param1    param2    param3
# 0    Alice    10    40    60
# 1    Bob    20    50    20
# 2    Charlie    30    60    60

実装1

method_list = ['param1', 'param2', 'param3']

df_list = []

for method in method_list:
    df_temp = df.copy()
    df_temp['method'] = method
    df_temp['judge'] = df_temp[method] > 50
    df_list.append(df_temp)

df_result1 = pd.concat(df_list)
df_result1.reset_index(drop=True, inplace=True)



# name    param1    param2    param3    variable    value
# 0    Alice    10    40    60    param1    False
# 1    Bob    20    50    20    param1    False
# 2    Charlie    30    60    60    param1    False
# 3    Alice    10    40    60    param2    False
# 4    Bob    20    50    20    param2    False
# 5    Charlie    30    60    60    param2    True
# 6    Alice    10    40    60    param3    True
# 7    Bob    20    50    20    param3    False
# 8    Charlie    30    60    60    param3    True

実装2

df_temp = df.copy()

col_dict = {'judge1': 'param1', 'judge2':'param2', 'judge3':'param3'}

for k, v in col_dict.items():
    df_temp[k] = df_temp[v] > 50

df_melt = df_temp.melt(
    id_vars=['name', 'param1', 'param2', 'param3'],
    value_vars=['judge1', 'judge2', 'judge3'])

df_result2 = df_melt.replace(col_dict)

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

Google Colab にて確認

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie'],
    'param1': [10, 20, 30],
    'param2': [40, 50, 60],
    'param3': [60, 20, 60],
})

method_list = ['param1', 'param2', 'param3']
df_list = []
for method in method_list:
    judge = df[method] > 50
    df_temp = pd.DataFrame(index=judge.index, data={'method':method, 'judge':judge})
    df_list.append(df_temp)

df_judge = pd.concat(df_list)
df_result1 = df.merge(df_judge, left_index=True, right_index=True, how='outer')
df_result1.reset_index(drop=True, inplace=True)
print(df_result1)
"""
      name  param1  param2  param3  method  judge
0    Alice      10      40      60  param1  False
1    Alice      10      40      60  param2  False
2    Alice      10      40      60  param3   True
3      Bob      20      50      20  param1  False
4      Bob      20      50      20  param2  False
5      Bob      20      50      20  param3  False
6  Charlie      30      60      60  param1  False
7  Charlie      30      60      60  param2   True
8  Charlie      30      60      60  param3   True
"""

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/10/14 10:41

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

    キャンセル

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る