根据条件和最大值在 Pandas 中创建新行
Creating New Row in Pandas based off Condition and Max values
我有一个 pandas df,其中包含以下数据:
Index Race_id Place_payout Place_outcome
5 7019 7659.0 1
6 7019 11096.0 1
7 7019 14791.0 0
9 7019 5810.0 0
10 7019 3093.0 0
11 7019 25335.0 0
12 7019 11516.0 0
13 7019 4571.0 0
14 7019 3798.0 0
我需要创建一个新专栏。
此栏是那匹马的红利,基于以下公式:
place_div = ((((0.78* Total_Amount_Wagered_For_Race)-(Maximum_Amount_Wagered + Current_Row_Value_Wagered))/current_row_value_wagered)/2)+1
除非当前行是组内的最大值,否则我需要使用第二高的值作为最大下注金额
此列如下所示:
Index Race_id Place_payout Place_outcome place_div
5 7019 7659.0 1 7.618085
6 7019 11096.0 1 5.723
7 7019 14791.0 0 4.668035
9 7019 5810.0 0 9.565131
10 7019 3093.0 0 16.64983
11 7019 25335.0 0 3.349552
12 7019 11516.0 0 5.568983
13 7019 4571.0 0 11.75124
14 7019 3798.0 0 13.83765
我尝试使用以下代码:
proba_win['div_place'] = proba_win['place_payout'].loc[proba_win.groupby('race_id')['place_payout'].idxmax()]
希望这会提取组内的值以获得最大支出,但结果 df 是:
Index div_place
5 NaN
6 NaN
7 NaN
9 NaN
10 NaN
11 25335.0
12 NaN
13 NaN
此外,我似乎找不到找到第二高值的方法。
使用 nlargest returns 错误:
proba_win['div_place'] = proba_win.groupby('race_id')['place_payout'].nlargest(1)
Traceback (most recent call last):
File "<ipython-input-1551-47283ddea8e5>", line 1, in <module>
proba_win['div_place'] = proba_win.groupby('race_id')['place_payout'].nlargest(1)
File "C:\Users\fredd\Anaconda3\lib\site-packages\pandas\core\frame.py", line 3163, in __setitem__
self._set_item(key, value)
File "C:\Users\fredd\Anaconda3\lib\site-packages\pandas\core\frame.py", line 3239, in _set_item
value = self._sanitize_column(key, value)
File "C:\Users\fredd\Anaconda3\lib\site-packages\pandas\core\frame.py", line 3873, in _sanitize_column
value = reindexer(value)
File "C:\Users\fredd\Anaconda3\lib\site-packages\pandas\core\frame.py", line 3869, in reindexer
) from err
TypeError: incompatible index of inserted column with frame index
我假设该解决方案将使用某种带有内置辅助函数的应用,但我还没有能够开发出解决方案。
有几种方法可以做到这一点,但这是最简单的。为了便于阅读,我在应用操作之外定义了函数。
def get_place_div(row):
total_wagered, max_wagered = df.loc[df.Race_id==row.Race_id,'Place_payout'].agg(['sum','max'])
place_div = ((((0.78*total_wagered)-max_wagered+row.Place_payout)/row.Place_payout)/2)+1
return place_div
df['place_div']=df.apply(lambda row: get_div_place(row),axis=1)
我有一个 pandas df,其中包含以下数据:
Index Race_id Place_payout Place_outcome
5 7019 7659.0 1
6 7019 11096.0 1
7 7019 14791.0 0
9 7019 5810.0 0
10 7019 3093.0 0
11 7019 25335.0 0
12 7019 11516.0 0
13 7019 4571.0 0
14 7019 3798.0 0
我需要创建一个新专栏。
此栏是那匹马的红利,基于以下公式:
place_div = ((((0.78* Total_Amount_Wagered_For_Race)-(Maximum_Amount_Wagered + Current_Row_Value_Wagered))/current_row_value_wagered)/2)+1
除非当前行是组内的最大值,否则我需要使用第二高的值作为最大下注金额
此列如下所示:
Index Race_id Place_payout Place_outcome place_div
5 7019 7659.0 1 7.618085
6 7019 11096.0 1 5.723
7 7019 14791.0 0 4.668035
9 7019 5810.0 0 9.565131
10 7019 3093.0 0 16.64983
11 7019 25335.0 0 3.349552
12 7019 11516.0 0 5.568983
13 7019 4571.0 0 11.75124
14 7019 3798.0 0 13.83765
我尝试使用以下代码:
proba_win['div_place'] = proba_win['place_payout'].loc[proba_win.groupby('race_id')['place_payout'].idxmax()]
希望这会提取组内的值以获得最大支出,但结果 df 是:
Index div_place
5 NaN
6 NaN
7 NaN
9 NaN
10 NaN
11 25335.0
12 NaN
13 NaN
此外,我似乎找不到找到第二高值的方法。 使用 nlargest returns 错误:
proba_win['div_place'] = proba_win.groupby('race_id')['place_payout'].nlargest(1)
Traceback (most recent call last):
File "<ipython-input-1551-47283ddea8e5>", line 1, in <module>
proba_win['div_place'] = proba_win.groupby('race_id')['place_payout'].nlargest(1)
File "C:\Users\fredd\Anaconda3\lib\site-packages\pandas\core\frame.py", line 3163, in __setitem__
self._set_item(key, value)
File "C:\Users\fredd\Anaconda3\lib\site-packages\pandas\core\frame.py", line 3239, in _set_item
value = self._sanitize_column(key, value)
File "C:\Users\fredd\Anaconda3\lib\site-packages\pandas\core\frame.py", line 3873, in _sanitize_column
value = reindexer(value)
File "C:\Users\fredd\Anaconda3\lib\site-packages\pandas\core\frame.py", line 3869, in reindexer
) from err
TypeError: incompatible index of inserted column with frame index
我假设该解决方案将使用某种带有内置辅助函数的应用,但我还没有能够开发出解决方案。
有几种方法可以做到这一点,但这是最简单的。为了便于阅读,我在应用操作之外定义了函数。
def get_place_div(row):
total_wagered, max_wagered = df.loc[df.Race_id==row.Race_id,'Place_payout'].agg(['sum','max'])
place_div = ((((0.78*total_wagered)-max_wagered+row.Place_payout)/row.Place_payout)/2)+1
return place_div
df['place_div']=df.apply(lambda row: get_div_place(row),axis=1)