相对于同一列中的其他值创建列(自上次事务后的时间)Pandas

2024-09-28 19:04:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据集有两列,分别是userid和transaction time。我想创建第三列,指出自上次用户购买以来的时间。例如:

User Id Timestamp
92212   2015-08-20T15:52:53
26123   2015-10-29T14:44:06
92212   2015-07-21T16:21:55

第三列内容如下:

^{pr2}$

其中1表示自上次购买后一个月(8月vs 7月),0表示首次购买(或者可能更适合NaN?)。在

本质上,我需要对userid进行分组,按时间顺序排列事务时间,并计算到之前时间的距离。也可以采用任何其他方法来解决自上次订单以来的保留问题。在

我现在已经把它打包成这样的代码:

def monthSinceLastOrder(transactionArray):
    transactionArray = transactionArray.order()
    monthValues = []
    for transDate in transactionArray:
        monthValues.append(transDate.month)
    distance = [-1]
    for i in monthValues:
        if monthValues[0]==i:
            prior=i
        else:
            distance.append(i-prior)
            prior=i
    return distance

Tags: 数据用户infortime时间distancetransaction
2条回答

您描述的是PandasSplit-Apply-Combine方法。http://pandas.pydata.org/pandas-docs/stable/groupby.html

我们可以根据用户Id进行分组,然后为每个组应用一个函数来计算行之间的差异。在

让我们设置数据帧:

import pandas as pd

data = [
    {'User Id': '9272', 'Timestamp': '2015-08-20T15:52:53'},
    {'User Id': '26121', 'Timestamp': '2015-10-29T14:44:06'},
    {'User Id': '9272', 'Timestamp': '2015-07-21T16:21:55'},
]

df = pd.DataFrame(data)
df['Timestamp'] = pd.to_datetime(df['Timestamp'])

现在定义一个将在每个组上操作的函数,并应用它。在

该函数按时间戳排序,并为每一行创建一个新的Delta列,设置为自身与前一行之间的差异。如果没有前一行(即第一次购买),则返回NaT。在

^{pr2}$

生成的数据帧如下所示:

    Timestamp           User Id Delta
1   2015-10-29 14:44:06 26121   NaT
2   2015-07-21 16:21:55 9272    NaT
0   2015-08-20 15:52:53 9272    29 days 23:30:58

从向量化操作的角度考虑这一点的方法是使用shift来偏移时间戳列,然后使用减法(这将沿着数组广播)

df.sort_values(by='Timestamp')\
  .groupby('User')\
  .apply(lambda x: x['Timestamp'] - x['Timestamp'].shift())

User    
26123  1                NaT
92212  2                NaT
       0   29 days 23:30:58
Name: Id, dtype: timedelta64[ns]

相关问题 更多 >