将功能应用于数据框

时间:2018-10-09 17:04:23

标签: python pandas dataframe series

所以我有一个数据框。我提取了所有重要的数字列,并将它们存储在error: expected 'lsl' or 'sxtx' with optional shift of #0 or #3 (这是一个列表)中。

然后,我要针对模型对这些每本Bookies应用kelly准则(如下定义):

LSL x4, x4, #2      // multiply index by 4 for 32-bit int
LDR x0, [SP, x4]    // Load to x0, (arr[index]) for return;

这就是我尝试应用的方式:

bookies

这是我得到的错误:

def kelly_criterion(bookie_odds, model):
    kelly = (((bookie_odds-1) * model ) - (1-model)) / (bookie_odds-1)
    return kelly

我正在使用的所有列都是float64类型。

2 个答案:

答案 0 :(得分:4)

pd.Series.apply仅适用于一列并传递值。

pd.DataFrame.apply处理多个列并传递pd.Series对象。

如果您重新定义函数,仍可以使用pd.Series.apply

def kelly_criterion(model, bookie_odds):
    kelly = (((bookie_odds-1) * model ) - (1-model)) / (bookie_odds-1)
    return kelly

for bookie in bookies:
    df[f'{bookie}_kelly'] = df['win'].apply(kelly_criterion, bookie_odds=bookie)

但是,您应该使用矢量化方法来利用Pandas框架:

for bookie in bookies:
    num = (df[bookie] - 1) * df['win'] - 1 + df['win']
    denum = df[bookie] - 1
    df[f'{bookie}_kelly'] = num / denum

完整的矢量化:

kellies = [f'{bookie}_kelly' for bookie in bookies]

bookies_sub_1 = df[bookies] - 1
df[kellies] = (bookies_sub_1 * df['win'] - 1 + df['win']) / bookies_sub_1

答案 1 :(得分:2)

在这种情况下,看起来好像不需要使用apply,因为函数可以接收并返回相同形状的Series。在对单个元素执行操作时,应用可能更适合,但看起来像这样向量化:

for bookie in bookies:
    df[bookie + "_kelly"] = kelly_criterion(df[bookie],df["win"])