Python 熊猫:我应该使用Apply Lambda来实现简单的函数吗?
我知道有不止一种方法可以做到这一点并完成工作。在选择是否使用Apply Lambda时,除了性能之外,还有其他考虑因素吗?我有一个特别大的数据框,里面有一列电子邮件,我需要从所有邮件中删除“@domain”。这里有一个简单的例子:Python 熊猫:我应该使用Apply Lambda来实现简单的函数吗?,python,pandas,lambda,Python,Pandas,Lambda,我知道有不止一种方法可以做到这一点并完成工作。在选择是否使用Apply Lambda时,除了性能之外,还有其他考虑因素吗?我有一个特别大的数据框,里面有一列电子邮件,我需要从所有邮件中删除“@domain”。这里有一个简单的例子: DF['PRINCIPAL'] = DF['PRINCIPAL'].str.split("@", expand=True)[0] 然后应用Lambda: DF['PRINCIPAL'] = DF.apply(lambda x: x['PRINCIPAL'].str.
DF['PRINCIPAL'] = DF['PRINCIPAL'].str.split("@", expand=True)[0]
然后应用Lambda:
DF['PRINCIPAL'] = DF.apply(lambda x: x['PRINCIPAL'].str.split("@", expand=True)[0]
我假设它们大致相当,但它们的执行方法意味着它们在某些情况下都更有效。有什么我应该知道的吗?你可以使用
assign
,这是Marc Garcia在演讲中推荐的方法,因为你可以在同一数据帧上链接操作参见6:17到7:30之间的示例:
DF=DF.assign(PRINCIPAL=lambda x:x['PRINCIPAL'].str.split(“@”,expand=True)[0])
您可以使用assign
,这是Marc Garcia在演讲中推荐的方法,因为您可以在同一数据帧上链接操作参见6:17到7:30之间的示例:
DF=DF.assign(PRINCIPAL=lambda x:x['PRINCIPAL'].str.split(“@”,expand=True)[0])
使用:
输出
True
时间:
%timeit s1 = df['email'].str.split('@').str[0]
每个回路1.77 ms±75.8µs(7次运行的平均值±标准偏差,每个1000个回路)
每个回路737µs±67.4µs(7次运行的平均值±标准偏差,1000个回路
(各)
使用:
输出
True
时间:
%timeit s1 = df['email'].str.split('@').str[0]
每个回路1.77 ms±75.8µs(7次运行的平均值±标准偏差,每个1000个回路)
每个回路737µs±67.4µs(7次运行的平均值±标准偏差,1000个回路
(各)
避免两者。。。。简单的列表理解很可能比使用.str accessor要好。AFAIK lambda比
for
循环好,但比向量化操作差。尽可能避免,只有在没有其他选择时才使用。话虽如此,我不确定lambda
如何公平对待.str
方法DF['PRINCIPAL']=[x.strip('@')[0]对于DF['PRINCIPAL']]
中的x,你可以看到对于一个测试,列表理解比.str
访问器更快。str访问在源代码内部非常循环,再加上pandas的开销。在大多数情况下,列表理解优于使用.str访问器。请避免两者。。。。简单的列表理解很可能比使用.str accessor要好。AFAIK lambda比for
循环好,但比向量化操作差。尽可能避免,只有在没有其他选择时才使用。话虽如此,我不确定lambda
如何公平对待.str
方法DF['PRINCIPAL']=[x.strip('@')[0]对于DF['PRINCIPAL']]
中的x,你可以看到对于一个测试,列表理解比.str
访问器更快。str访问在源代码内部非常循环,再加上pandas的开销。在大多数情况下,列表理解优于使用.str访问器。谢谢@ScottBoston和@QuangHoang!伟大的信息和帮助!谢谢你@ScottBoston和@QuangHoang!伟大的信息和帮助!