我知道有多种方法可以解决此问题并完成工作。在选择是否使用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]
我假设它们大致相等,但是它们是执行方法,这意味着它们在某些情况下效率更高。有什么我应该知道的吗?
答案 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])