我想避免apply(),而是将数据处理向量化。
我有一个功能可以根据一些“ if”和“ else”条件存储数据。如何将数据传递给此功能?
def my_function(id):
if 0 <= id <= 30000:
cal_score = 5
else:
cal_score = 0
return cal_score
Apply()有效,它遍历每一行
但是,apply()处理大量数据的速度很慢。 (我的情况)
df['final_score'] = df.apply(lambda x : my_function(x['id']), axis = 1)
传递一个numpy数组不起作用!
df['final_score'] = my_function(df['id'].values)
错误:“具有多个元素的数组的真值不明确。请使用a.any()或a.call()
它不喜欢整个数组都通过,因为我的函数中的“ if”循环由于一个以上的元素而出错了
我想基于ID值但通过传递整个数组来更新我的final_score列。
我该如何设计或解决这个问题?
答案 0 :(得分:2)
使用Series.between
创建条件,将结果掩码乘以5。
df['final_score'] = df['id'].between(0, 30000, inclusive=True) * 5
答案 1 :(得分:0)
很简单:
通过'.values'将系列转换为numpy数组
n_a = df ['final_score']。values
向量化功能
vfunc = np.vectorize(my_function)
使用矢量化函数计算结果数组:
res_array = vfunc(n_a)
df ['final_score'] = res_array
检查https://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.vectorize.html以获得更多详细信息
在pd.Series上转换为numpy数组的矢量化计算可能比使用内部熊猫计算快10倍