我有像这样的数据帧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
答案 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)