熊猫系列条件如何进行矢量化处理?

时间:2019-04-08 23:19:56

标签: python python-3.x pandas numpy

我想避免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列。

我该如何设计或解决这个问题?

2 个答案:

答案 0 :(得分:2)

使用Series.between创建条件,将结果掩码乘以5。

df['final_score'] = df['id'].between(0, 30000, inclusive=True) * 5

答案 1 :(得分:0)

很简单:

  1. 通过'.values'将系列转换为numpy数组

    n_a = df ['final_score']。values

  2. 向量化功能

    vfunc = np.vectorize(my_function)

  3. 使用矢量化函数计算结果数组:

    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倍