熊猫:我应该对简单功能使用Apply Lambda吗?

时间:2019-08-12 20:47:17

标签: python pandas lambda

我知道有多种方法可以解决此问题并完成工作。在选择是否使用Apply Lambda时,除了性能之外,还有其他考虑事项吗?我有一个带有一列电子邮件的特别大的数据框,我需要从所有电子邮件中删除“ @domain”。有一个简单的方法:

DF['PRINCIPAL'] = DF['PRINCIPAL'].str.split("@", expand=True)[0]

然后是Apply Lambda:

DF['PRINCIPAL'] = DF.apply(lambda x: x['PRINCIPAL'].str.split("@", expand=True)[0]

我假设它们大致相等,但是它们是执行方法,这意味着它们在某些情况下效率更高。有什么我应该知道的吗?

2 个答案:

答案 0 :(得分:2)

使用:

df = pd.DataFrame({'email':['abc@ABC.com']*1000})

s1 = df['email'].str.split('@').str[0]

s2 = pd.Series([i.split('@')[0] for i in df['email']], name='email')

s1.eq(s2).all()

输出

True

时间:

%timeit s1 = df['email'].str.split('@').str[0]
  

每个循环1.77 ms±75.8 µs(平均±标准偏差,共运行7次,每个循环1000次)

%timeit s2 = pd.Series([i.split('@')[0] for i in df['email']], name='email')
  

每个循环737 µs±67.4 µs(平均±标准偏差,每次运行7次,循环1000次   每个)

答案 1 :(得分:0)

您可以使用assign,这是Marc Garcia在演讲toward pandas 1.0中建议的方法,因为您可以在同一数据帧上链接操作,请参见6:17到7:30之间的示例:

DF = DF.assign(PRINCIPAL=lambda x: x['PRINCIPAL'].str.split("@", expand=True)[0])