我有数据框
site1 time1 site2 time2 site3 time3 site4 time4 site5 time5 ... time6 site7 time7 site8 time8 site9 time9 site10 time10 target
session_id
21669 56 2013-01-12 08:05:57 55.0 2013-01-12 08:05:57 NaN NaT NaN NaT NaN NaT ... NaT NaN NaT NaN NaT NaN NaT NaN NaT 0
54843 56 2013-01-12 08:37:23 55.0 2013-01-12 08:37:23 56.0 2013-01-12 09:07:07 55.0 2013-01-12 09:07:09 NaN NaT ... NaT NaN NaT NaN NaT NaN NaT NaN NaT 0
77292 946 2013-01-12 08:50:13 946.0 2013-01-12 08:50:14 951.0 2013-01-12 08:50:15 946.0 2013-01-12 08:50:15 946.0 2013-01-12 08:50:16 ... 2013-01-12 08:50:16 948.0 2013-01-12 08:50:16 784.0 2013-01-12 08:50:16 949.0 2013-01-12 08:50:17 946.0 2013-01-12 08:50:17 0
我需要计算最后一次非 NaN 时间和第一次之间的差异。
期望输出(转换为秒)
session_id diff
21669 0
54843 2013-01-12 09:07:09 - 2013-01-12 08:37:23 55.0
77292 4
我可以对每一对进行处理,然后合并
df['diff1'] = df['time1'] - df['time2']
...
但是有什么方法可以更快吗?
请您参考如下方法:
- 我放弃了
目标 - 我将您的列拆分为
pd.MultiIndex - 确保时间戳实际上是时间戳(除非你这样做,否则不需要在你这边做)
groupby'session_id'然后使用'first'和'last'得到第一个和最后一个非空值。pipe方便地将结果传递给为我做减法的函数
d = df.drop('target', 1)
a = d.columns.str.extract('([a-z]+)(\d+)', expand=True).values.T
mux = pd.MultiIndex.from_arrays([a[0], a[1].astype(int)])
d.columns = mux
for (c0, c1), col in d.iteritems():
if c0 == 'time':
d[(c0, c1)] = pd.to_datetime(col, errors='coerce')
f = lambda d: d['last'].sub(d['first']).dt.total_seconds()
d.time.stack().groupby('session_id').agg(['last', 'first']).pipe(f)
session_id
21669 0.0
54843 1786.0
77292 4.0
dtype: float64
