根据条件和最大值在 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)