Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:列之间的差异_Python_Pandas - Fatal编程技术网

Python 熊猫:列之间的差异

Python 熊猫:列之间的差异,python,pandas,Python,Pandas,我有数据帧 site1 time1 site2 time2 site3 time3 site4 time4 site5 time5 ... time6 site7 time7 site8 time8 site9 time9 site10 time10 target session_id

我有数据帧

    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
我需要计算上次和第一次之间的差异

期望输出(转换为秒)

我可以对每一对进行合并

df['diff1'] = df['time1'] - df['time2']
...
但是有什么方法可以更快地完成吗?

在数据帧上使用
.ffill()
,只使用
时间列:

df['diff1'] = df.filter(like='time').ffill(axis = 1).time10 - df.time1
在数据帧上使用
.ffill()

df['diff1'] = df.filter(like='time').ffill(axis = 1).time10 - df.time1
  • 我放弃了目标
  • 我将您的列拆分为一个
    pd.MultiIndex
  • 确保时间戳实际上是时间戳(除非您这样做,否则无需在您的端执行此操作)
  • groupby
    'session\u id'
    然后使用
    'first'
    'last'
    获取第一个和最后一个非空值
  • pipe
    方便地将结果传递给一个函数,该函数为我进行减法运算

    • 我放弃了目标
  • 我将您的列拆分为一个
    pd.MultiIndex
  • 确保时间戳实际上是时间戳(除非您这样做,否则无需在您的端执行此操作)
  • groupby
    'session\u id'
    然后使用
    'first'
    'last'
    获取第一个和最后一个非空值
  • pipe
    方便地将结果传递给一个函数,该函数为我进行减法运算

  • 使用:

    • 带有
      时间的列
    • 使用last获取列名称
    • 通过到
      系列
    • 最后

    numpy替代方案

    A = df.filter(like='time')
    b =  len(A.columns) - A.notnull().values[:, ::-1].argmax(1) - 1
    
    df['diff'] = pd.Series(A.values[np.arange(len(A)),b]).sub(df['time1']).dt.total_seconds()
    print (df['diff'])
    0       0.0
    1    1786.0
    2       4.0
    Name: diff, dtype: float64
    
    更通用的解决方案-通过以下方式选择第一列和最后一列:

    使用:

    • 带有
      时间的列
    • 使用last获取列名称
    • 通过到
      系列
    • 最后

    numpy替代方案

    A = df.filter(like='time')
    b =  len(A.columns) - A.notnull().values[:, ::-1].argmax(1) - 1
    
    df['diff'] = pd.Series(A.values[np.arange(len(A)),b]).sub(df['time1']).dt.total_seconds()
    print (df['diff'])
    0       0.0
    1    1786.0
    2       4.0
    Name: diff, dtype: float64
    
    更通用的解决方案-通过以下方式选择第一列和最后一列:


    如果您提供了一种方便的方法来生成样本数据,则可以使人们更容易回答您的问题。如果您提供了一种方便的方法来生成样本数据,则可以使人们更容易回答您的问题。
    A = df.filter(like='time')
    b =  len(A.columns) - A.notnull().values[:, ::-1].argmax(1) - 1
    
    df['diff'] = pd.Series(A.values[np.arange(len(A)),b]).sub(df['time1']).dt.total_seconds()
    print (df['diff'])
    0       0.0
    1    1786.0
    2       4.0
    Name: diff, dtype: float64
    
    df1 = df.filter(like='time')
    df['diff']= df1.ffill(1).iloc[:, -1].sub(df1.iloc[:, 0]).dt.total_seconds()
    print (df['diff'])
    0       0.0
    1    1786.0
    2       4.0
    Name: diff, dtype: float64