Pandas 分配 Lambda 函数

Pandas Assign Lambda Function

我有一个具有打开时间和关闭时间的 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'

需要 .dt 访问器,因为如果 DatetimeIndex:

使用 datetime Series.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.

总秒数在 .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.