Pandas分配Lambda函数

13

我有一个DataFrame,其中包含开放时间和关闭时间,我正在尝试计算毫秒差。

我的代码目前是这样的

df = df.assign(Latency=lambda d: d.CloseTimeStamp - d.CreationTimeStamp)
df.Latency = df.apply(lambda d: d.Latency.total_seconds() * 1000., axis=1)

然而,我想知道为什么我不能像以下这样一行完成

df = df.assign(Latency=lambda d: (d.CloseTimeStamp - d.CreationTimeStamp).total_seconds() * 1000.)

当我尝试使用后者时,出现了AttributeError: 'Series' object has no attribute 'total_seconds'的错误。


1
它是如何工作的? - jezrael
2个回答

14

总秒数在.dt属性中,因此应该可以这样操作:

df = df.assign(Latency=lambda d: (d.CloseTimeStamp - d.CreationTimeStamp).dt.total_seconds() * 1000.)

虽然如此说,没有必要使用lambda函数:

df = df.assign(Latency=(df.CloseTimeStamp - df.CreationTimeStamp).dt.total_seconds() * 1000.)

速度更快。

关于效率的另一个注释:df.assign() 构建了一个全新的数据框对象;如果你打算将此对象重新分配回 df,最好直接就地修改 df

df['Latency'] = (df.CloseTimeStamp - df.CreationTimeStamp).dt.total_seconds() * 1000.

2
需要使用 .dt 访问器,因为在处理 datetime Series 时,如果是 DatetimeIndex,则会省略 .dt
df = df.assign(Latency=lambda d: (d.CloseTimeStamp -  d.CreationTimeStamp).dt.total_seconds() * 1000.)

没有lambda的解决方案:
df = df.assign(Latency=(df.CloseTimeStamp - df.CreationTimeStamp).dt.total_seconds() * 1000.)

...并且不使用assign的解决方案:

df['Latency'] = (df.CloseTimeStamp - df.CreationTimeStamp).dt.total_seconds() * 1000.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接