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