【问题标题】:how to apply Numpy Vectorize instead of apply function如何应用 Numpy Vectorize 而不是应用函数
【发布时间】:2021-10-19 00:31:21
【问题描述】:

我有一个如下的熊猫数据框

data = {

'ID' : [0,0,0,0,0,1],
        
'DAYS': [293,1111,3020,390,210,10],
 

}



df = pd.DataFrame(data, columns = ['ID','DAYS'])
    ID  DAYS
0   0   293
1   0   1111
2   0   3020
3   0   390
4   0   210
5   1   10

我要做的是具有以下条件的简单应用函数,并将列输出为布尔值:

df['bool'] = df.apply(lambda x:( x['DAYS'] < 365),axis =1  )

我想优化这个 apply-lambda 部分.. 我设法在 numpy 数组中做到了

df['bool_numpy'] = np.where(df['DAYS'] <365 ,True ,False)

但我正在努力为 np.vectorize 方法应用相同的东西。

def copy_filter(df):
    if df['DAYS'] <365:
        return True
    else:
        return False

a= np.vectorize(copy_filter, otypes = [bool])
df['bool_vectorize'] = a(df['DAYS'])

但给了我一个错误。 任何帮助,将不胜感激。 而且,针对这个问题的任何其他优化技术也会很棒!

【问题讨论】:

    标签: python pandas numpy apply


    【解决方案1】:

    你不需要apply 也不需要vectorize

    df['bool'] = df['DAYS'] < 365
    

    输出:

       ID  DAYS   bool
    0   0   293   True
    1   0  1111  False
    2   0  3020  False
    3   0   390  False
    4   0   210   True
    5   1    10   True
    

    【讨论】:

    • 如果我要使用 vectorize ,它甚至可能吗?
    • @dakjdlajsl 这是可能的,但在这种情况下它是低效且不必要的。
    • 是的,检查@BENY 的答案,但这对于这种操作是没用的。请注意,vectorize 将允许您的函数接受向量作为输入。它将为您提供矢量速度操作。这只是一个循环的包装器
    【解决方案2】:

    把你的函数改成

    def copy_filter(x):
        if x <365:
            return True
        else:
            return False
    a= np.vectorize(copy_filter, otypes = [bool])
    df['bool_vectorize'] = a(df['DAYS'])
    df
       ID  DAYS  bool_vectorize
    0   0   293            True
    1   0  1111           False
    2   0  3020           False
    3   0   390           False
    4   0   210            True
    5   1    10            True
    

    【讨论】:

    • def copy_filter(x): return x &lt; 365 甚至lambda x: x &lt; 365
    猜你喜欢
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    相关资源
    最近更新 更多