groupby中按日期时间过滤的有效方法

马库斯

鉴于DataFrame生成者:

import numpy as np
import pandas as pd
from datetime import timedelta

np.random.seed(0)
rng = pd.date_range('2015-02-24', periods=14, freq='9H')
ids = [1]*5 + [2]*2 + [3]*7
df = pd.DataFrame({'id': ids, 'time_entered': rng, 'val': np.random.randn(len(rng))})

df

    id  time_entered        val
0   1   2015-02-24 00:00:00 1.764052
1   1   2015-02-24 09:00:00 0.400157
2   1   2015-02-24 18:00:00 0.978738
3   1   2015-02-25 03:00:00 2.240893
4   1   2015-02-25 12:00:00 1.867558
5   2   2015-02-25 21:00:00 -0.977278
6   2   2015-02-26 06:00:00 0.950088
7   3   2015-02-26 15:00:00 -0.151357
8   3   2015-02-27 00:00:00 -0.103219
9   3   2015-02-27 09:00:00 0.410599
10  3   2015-02-27 18:00:00 0.144044
11  3   2015-02-28 03:00:00 1.454274
12  3   2015-02-28 12:00:00 0.761038
13  3   2015-02-28 21:00:00 0.121675

我需要为每个id,除去超过从最新24小时(1天)行time_entered,因为这id我当前的解决方案:

def custom_transform(x):
    datetime_from = x["time_entered"].max() - timedelta(days=1)
    x = x[x["time_entered"] > datetime_from]
    return x

df.groupby("id").apply(lambda x: custom_transform(x)).reset_index(drop=True)

给出正确的预期输出:

    id  time_entered        val
0   1   2015-02-24 18:00:00 0.978738
1   1   2015-02-25 03:00:00 2.240893
2   1   2015-02-25 12:00:00 1.867558
3   2   2015-02-25 21:00:00 -0.977278
4   2   2015-02-26 06:00:00 0.950088
5   3   2015-02-28 03:00:00 1.454274
6   3   2015-02-28 12:00:00 0.761038
7   3   2015-02-28 21:00:00 0.121675

但是,我的真实数据是数千万行和数十万个唯一ID,因此,此解决方案是不可行的(需要很长时间)。

有没有更有效的方法来过滤数据?我感谢所有想法!

广晃

通常,请避免使用,groupby().apply()因为它不是跨组向量化的,更不用说如果您要返回新的数据帧(如您的情况)那样的内存分配开销。

如何找到时间阈值,groupby().transform然后对整个数据使用布尔索引:

time_max_by_id = df.groupby('id')['time_entered'].transform('max') - pd.Timedelta('1D')
df[df['time_entered'] > time_max_by_id]

输出:

    id        time_entered       val
2    1 2015-02-24 18:00:00  0.978738
3    1 2015-02-25 03:00:00  2.240893
4    1 2015-02-25 12:00:00  1.867558
5    2 2015-02-25 21:00:00 -0.977278
6    2 2015-02-26 06:00:00  0.950088
11   3 2015-02-28 03:00:00  1.454274
12   3 2015-02-28 12:00:00  0.761038
13   3 2015-02-28 21:00:00  0.121675

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有效日期范围一键编码groupby

从PostgreSQL的时间戳中提取日期的最有效方法是什么?

在Elixir中按值过滤地图的有效方法

pyspark最有效的日期时间戳匹配

在iOS / Swift应用程序中跟踪时间/日期的最有效方法是什么?

按财政季度对R中两个日期之间有效的记录进行计数

从时间序列中删除特定日期(2月29日)的最有效方法

熊猫-按日期计算不同的值-更有效的方法?

在C#中无法将字符串识别为有效的日期时间

pyspark中的有效GroupBy / CombineBy

如何有效地比较日期时间对象

提取BigQuery中按日期分组的标签时间轴的最有效查询

LINQ-按相同功能过滤和排序的最有效方法

找到最小时间和日期戳的有效方法是什么?

将日期列转换为时间戳列+小时的最有效方法

什么是在Django中过滤对象的最有效方法

按有效日期和无效日期计算单位

在R中过滤数据的更有效方法

过滤有效日期-mysql

在C#中,字符串不是有效的日期时间

(MVC)这是按日期显示图表数据的有效方法吗?

按日期和/或月份和/或年份检索记录的最有效方法是什么?

Python过滤字典的有效方法

将日期时间与 varchar 进行比较的最有效方法

过滤列表的有效方法

按多列中的值在 R 中有效过滤数据帧

根据时间过滤目录中文件的有效方法?

数据框内的有效日期时间评估

按日期时间顺序从大表中有效选择数据