Skip to main content
 首页 » 编程设计

python之Pandas :列之间的差异

2025年05月04日20itcoder

我有数据框

    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