在另一个时间戳之前计算时间戳数量的更快方法

苏梅特·马吉亚(Sumeet Makhija)

我有两个数据框“火车”和“日志”。“日志”具有日期时间列“ time1”,而火车具有日期时间列“ time2”。对于“火车”中的每一行,我想找出“时间1”在“时间2”之前的“时间1”计数。

我已经尝试了dataframe的apply方法。

def log_count(row):
    return sum((log['user_id'] == row['user_id']) & (log['time1'] < row['time2']))
train.apply(log_count, axis = 1)

这种方法花费了很长时间。

算了吧

由于您要对每个(配对)user_id执行一次此操作,因此可以执行以下操作:

  • 创建一个名为is_logwhich的列1log0train

    log['is_log'] = 1
    train['is_log'] = 0
    

    is_log列将用于跟踪行是否来自logtrain

  • 连接log和数据train框:

    combined = pd.concat(
        [log.rename(columns=dict(time1="time")), train.rename(columns=dict(time2="time"))],
        axis=0,
        ignore_index=True,
        sort=False,
    )
    
  • 排序combined的数据帧user_id,并time

    combined = combined.sort_values(by=["user_id", "time"])
    

    所以现在combined看起来像这样:

             time  user_id  is_log
    6  2000-01-17        0       0
    0  2000-03-13        0       1
    1  2000-06-08        0       1
    7  2000-06-25        0       0
    4  2000-07-09        0       1
    8  2000-07-18        0       0
    10 2000-03-13        1       0
    5  2000-04-16        1       0
    3  2000-08-04        1       1
    9  2000-08-17        1       0
    2  2000-10-20        1       1
    
  • 现在,您要查找的计数可以表示为该is_log的累积总和,分组方式为user_id

    combined["count"] = combined.groupby("user_id")["is_log"].cumsum()
    train = combined.loc[combined["is_log"] == 0]
    

    这是主要思想:计算列中1s数量is_log等于计算inlog中每次出现之前的次数train


例如,

import numpy as np
import pandas as pd

np.random.seed(2019)


def random_dates(N):
    return np.datetime64("2000-01-01") + np.random.randint(
        365, size=N
    ) * np.timedelta64(1, "D")


N = 5
log = pd.DataFrame({"time1": random_dates(N), "user_id": np.random.randint(2, size=N)})
train = pd.DataFrame(
    {
        "time2": np.r_[random_dates(N), log.loc[0, "time1"]],
        "user_id": np.random.randint(2, size=N + 1),
    }
)

log["is_log"] = 1
train["is_log"] = 0
combined = pd.concat(
    [log.rename(columns=dict(time1="time")), train.rename(columns=dict(time2="time"))],
    axis=0,
    ignore_index=True,
    sort=False,
)
combined = combined.sort_values(by=["user_id", "time"])
combined["count"] = combined.groupby("user_id")["is_log"].cumsum()
train = combined.loc[combined["is_log"] == 0]

print(log)
#        time1  user_id  is_log
# 0 2000-03-13        0       1
# 1 2000-06-08        0       1
# 2 2000-10-20        1       1
# 3 2000-08-04        1       1
# 4 2000-07-09        0       1

print(train)

产量

         time  user_id  is_log  count
6  2000-01-17        0       0      0
7  2000-06-25        0       0      2
8  2000-07-18        0       0      3
10 2000-03-13        1       0      0
5  2000-04-16        1       0      0
9  2000-08-17        1       0      1

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在 Oracle 中从另一个时间戳中减去一个时间戳

计算另一个数据集中时间戳之前一定数量的行的均值和梯度

如何删除行,当时间戳与另一个时间戳完全一样

使用另一个时间戳数据框过滤熊猫上的时间戳数据框

通过另一个时间戳列压缩列中的值

如何从python中的时间列中删除一个时间点到另一个时间点的时间戳

选择每个日期的最后一个时间戳

自行加入下一个时间戳

在pyspark中的两个时间戳之间创建一个时间戳数组

从另一个给定的时间戳开始,在pandas系列中创建时间戳序列

将带有时间戳的数据与另一个数据集中的最接近时间进行匹配。正确向量化?更快的方法?

Python中是否有一种方法可以计算一个时间占另一个时间的百分比?

在另一个时间之前/之后寻找最近的时间

如何保存2个历史文件?一个带时间戳,另一个不带时间戳

条件格式(如果一个时间大于另一个时间)

从另一个时间减去一个时间字符串

从带有时间戳的一个表中获取最大值,并从另一个表中获取一个时间段的3秒

如何比较两个时间戳以查看一个时间戳是否晚了超过特定的分钟数?

如何将时间戳字符串转换为另一个时区的时间戳

在一个时间间隔内生成时间戳范围并查询所有重叠事件

查找事件的时间戳是否在一个时间间隔内

将时间戳从一个文件插入另一个文件

选择部分的第一个和最后一个时间戳

如何将先前的时间戳预测作为下一个时间戳的附加输入?

将不同时间戳格式的多个数据帧堆叠成一个时间戳

根据另一个数据帧的“时间戳”和“id”从一个数据帧中获取最大数量

选择唯一的外键行和上一个时间戳

sql求和一列,并且还返回上一个时间戳

检查一个时间范围是否进入另一个时间范围