![](/img/trans.png)
[英]Add a Rand to each row using Pandas' Assign and a Lambda Function
[英]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
属性中,所以这应该工作:
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.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.)
没有lambda的解决方案:
df = df.assign(Latency=(df.CloseTimeStamp - df.CreationTimeStamp).dt.total_seconds() * 1000.)
...和没有assign
解决方案:
df['Latency'] = (df.CloseTimeStamp - df.CreationTimeStamp).dt.total_seconds() * 1000.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.