熊猫将函数逐行应用花费太长时间,下面的代码是否有其他选择

问题描述 投票:1回答:1

我有一个如下所示的数据框和函数,我想将nor_group函数应用于数据框列,但是使用apply命令会花费太多时间。有什么办法可以减少这段代码的时间?目前每个循环要花24.4秒。

import pandas as pd
import numpy as np

np.random.seed(1234)
n = 1500000

df = pd.DataFrame()
df['group'] = np.random.randint(1700, size=n)
df['ID'] = np.random.randint(5, size=n)
df['Total'] = np.random.randint(400, size=n)
df['Normalized_total'] = df.groupby('group')['Total'].apply(lambda x: (x-x.min())/(x.max()- x.min()))
df['Normalized_total'] = df['Normalized_total'].apply(lambda x:round(x,2))

def norm_group(a,b):
    if a >= 0.7 and b >=1000:
        return "High"
    elif a >= 0.4 and b >=500:
        return "Medium"
    else:
        return "Low"

%timeit df['Categery'] = df.apply(lambda x:norm_group(a=x['Normalized_total'],b=x['group']), axis=1)

[24.4 s±551 ms每个循环(平均±标准偏差,共运行7次,每个循环1次)

我在原始数据框中有多个文本列,并且想要应用类似的功能,与之相比,这需要更多的时间。

谢谢

python pandas
1个回答
1
投票

您可以使用np.select进行矢量化:

df['Category'] = np.select((df['Normalized_total'].ge(0.7) & df['group'].ge(1000),
                            df['Normalized_total'].ge(0.4) & df['group'].ge(500)),
                           ('High', 'Medium'), default='Low'
                          )
© www.soinside.com 2019 - 2024. All rights reserved.