pandas apply typeError:'float'对象不可下标

Chi*_* Yi 5 python series apply pandas array-broadcasting

我有一个df_tr像这样的数据框:

      item_id    target   target_sum  target_count
0        0          0           1            50            
1        0          0           1            50              
Run Code Online (Sandbox Code Playgroud)

我试图找到目标的平均值,但排除当前行的目标值,并将平均值放入新列中。结果将是:

     item_id    target   target_sum  target_count item_id_mean_target
0        0          0           1            50           0.02041
1        0          0           1            50           0.02041
Run Code Online (Sandbox Code Playgroud)

item_id_mean_target从公式计算值:

target_sum - target/target_count - 1
Run Code Online (Sandbox Code Playgroud)

...用这个代码:

df_tr['item_id_mean_target'] = df_tr.target.apply(lambda x: (x['target_sum']-x)/(x['target_count']-1))     
Run Code Online (Sandbox Code Playgroud)

我认为我的解决方案是正确的,但我得到了:

TypeError: 'float' object is not subscriptable                
Run Code Online (Sandbox Code Playgroud)

cs9*_*s95 4

不需要在这里申请,pandas(以及numpy)广播操作。

df['item_id_mean_target'] = (df.target_sum - df.target) / (df.target_count - 1)
Run Code Online (Sandbox Code Playgroud)

df

   item_id  target  target_sum  target_count  item_id_mean_target
0        0       0           1            50             0.020408
1        0       0           1            50             0.020408
Run Code Online (Sandbox Code Playgroud)

至于为什么会发生错误,您正在调用apply一个pd.Series对象,因此,您不能引用其中的任何其他列apply(因为它只接收标量值)。

要修复它,您需要这样做df.apply(...),但此时您会因性能低下而受到惩罚,因此,我不建议这样做。