pandas apply typeError:'float'对象不可订阅

时间:2018-01-15 05:51:30

标签: python pandas

我有像这样的数据帧df_tr

      item_id    target   target_sum  target_count
0        0          0           1            50            
1        0          0           1            50              

我正在尝试找到目标的平均值,但不包括当前行的目标值,并将平均值放在新列中。结果将是:

     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

我如何获得item_id_mean_target值

target_sum - target/target_count - 1

我做的是

df_tr['item_id_mean_target'] = df_tr.target.apply(lambda x: (x['target_sum']-x)/(x['target_count']-1))     

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

TypeError: 'float' object is not subscriptable     

3 个答案:

答案 0 :(得分:3)

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

df['item_id_mean_target'] = (df.target_sum - df.target) / (df.target_count - 1)

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

至于您的错误发生的原因,您在apply对象上调用pd.Series,因此,您无法引用apply内的任何其他列(因为它只接收标量值)

要解决此问题,您需要执行df.apply(...),但此时,您会因为性能不佳而受到惩罚,因此,我不建议您这样做。

答案 1 :(得分:1)

忽略总和和计数列并使用groupby派生它们:

df_tr.groupby('item_id').apply(lambda x: (x['target'].sum() - x['target'])     
                                         / (x['target'].count() - 1))

您可能还会在原始声明中注意到x['target_sum']-x的问题。应该是x['target_sum']-x['target']

答案 2 :(得分:0)

试试这个:

df_tr.apply(lambda x:(x['target_sum']-x)/(x['target_count']-1), axis=1)