マルチレベルのインデックス付きパンダデータフレームの列の合計値を、新しい列の値の条件として使用する方法

砂のカスキー

マルチレベルのインデックスパンダデータフレームがあります。この列の値が条件に基づいている新しい列を作成したいと思います。この条件は、そのインデックスの別の列を合計してから半分にすることに基づいています。これが別のリストに格納されている最後の値よりも小さい場合、新しい列の値はデータフレームの別の列と同じ値になります。この条件が満たされない場合、新しい列のすべての値はである必要があります0

この質問を使用して、マルチインデックスデータフレームのレベルごとこの合計列を達成しようとしていますが、np.whereとの組み合わせを使用しましたdf.sum(level=0, axis=1)が、次のエラーが発生します。

ValueError: operands could not be broadcast together with shapes (2,8) (21,) ()

これが私のデータフレームとこれまでに使用したコードの例です。

import pandas as pd
import numpy as np

balance = [1400]

data = {'EVENT_ID': [112335580,112335580,112335580,112335580,112335580,112335580,112335580,112335580, 112335582,
                     112335582,112335582,112335582,112335582,112335582,112335582,112335582,112335582,112335582,
                     112335582,112335582,112335582],

 'SELECTION_ID': [6356576,2554439,2503211,6297034,4233251,2522967,5284417,7660920,8112876,7546023,8175276,8145908,
                  8175274,7300754,8065540,8175275,8106158,8086265,2291406,8065533,8125015],

 'Pot_Bet': [3.236731,2.416966,2.278365,2.264023,2.225353,2.174407, 2.141420,2.122386,2.832997,2.411094,
         2.167218,2.138972,2.132137,2.128341,2.116338,2.115239,2.115123,2.114284362,2.113420,
         2.113186,2.112729],

  'Liability':[3.236731, 2.416966, 12.245492, 12.795112, 15.079176, 23.336171, 50.741182, 571.003118, 2.832997, 6.691736, 15.808607, 27.935834, 35.954927, 43.275250, 147.165537, 193.017915, 199.622454, 265.809019, 405.808678, 473.926781, 706.332594]}

df = pd.DataFrame(data, columns=['EVENT_ID', 'SELECTION_ID', 'Pot_Bet','WIN_LOSE'])

df.set_index(['EVENT_ID', 'SELECTION_ID'], inplace=True) #Selecting columns for indexing

df['Bet'] = np.where(df.sum(level = 0) > 0.5*balance[-1], df['Pot_Bet'], 0)

これにより、前述のエラーが発生します。

インデックスの場合112335580、新しい列はと同じ値にする必要があります'Pot_Bet'インデックスの場合112335582、新しい列の値は0。である必要があります

乾杯、サンディ

ジェズリール

問題は、使用するdf.sum(level=0)場合と同じであるということですdf.groupby(level = 0).sum()-の最初のレベルによる集計MultiIndex

解決策は、オリジナルと同じサイズで使用さGroupBy.transformますSeriesDataFrame

df['Bet'] = np.where(df.groupby(level = 0)['Pot_Bet'].transform('sum') > 0.5*balance[-1], 
                     df['Pot_Bet'], 0)

詳細

print (df.groupby(level = 0)['Pot_Bet'].transform('sum'))
EVENT_ID   SELECTION_ID
112335580  6356576         18.859651
           2554439         18.859651
           2503211         18.859651
           6297034         18.859651
           4233251         18.859651
           2522967         18.859651
           5284417         18.859651
           7660920         18.859651
112335582  8112876         28.611078
           7546023         28.611078
           8175276         28.611078
           8145908         28.611078
           8175274         28.611078
           7300754         28.611078
           8065540         28.611078
           8175275         28.611078
           8106158         28.611078
           8086265         28.611078
           2291406         28.611078
           8065533         28.611078
           8125015         28.611078
Name: Pot_Bet, dtype: float64

列のみで作業する必要がある場合はSeries、列名で選択してください。

print (df['Pot_Bet'].sum(level=0))
EVENT_ID
112335580    18.859651
112335582    28.611078
Name: Pot_Bet, dtype: float64

print (df.groupby(level = 0)['Pot_Bet'].sum())
EVENT_ID
112335580    18.859651
112335582    28.611078
Name: Pot_Bet, dtype: float64

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ