熊猫分配 lambda 函数



我有一个数据帧,它有一个打开时间和关闭时间,我正在尝试以毫秒为单位计算差异。

我的代码目前是这样的

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属性内,因此这应该有效:

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.

需要.dt访问器,因为使用datetime Series,如果DatetimeIndex,则省略.dt

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

没有λ的解决方案:

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

。和没有assign的解决方案:

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

最新更新