Python 熊猫:我应该使用Apply Lambda来实现简单的函数吗?

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.

我知道有不止一种方法可以做到这一点并完成工作。在选择是否使用Apply Lambda时,除了性能之外,还有其他考虑因素吗?我有一个特别大的数据框,里面有一列电子邮件,我需要从所有邮件中删除“@domain”。这里有一个简单的例子:

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!伟大的信息和帮助!