基本的Pandas过滤适用于小型数据集,但不适用于大型数据集

时间:2019-08-20 00:46:28

标签: python pandas filtering

不幸的是,我无法发布实际的数据集,但这是我的问题的一个示例。我进行基本过滤时遇到问题。

我偶然发现了这个(很幸运?)。每当我在较小版本的数据集上实施以下代码时,我都会得到正确的输出。在这种情况下,记录显示在底部。

但是,当我在较大的数据集(数百万条记录)上实现此代码时,没有得到该结果,而是得到了1234的第一个条目(而不是最后一个)。当我将keep =“ last”换为“ first”时,我得到了该用户的正确答案。但是,这是不正确的。

奇怪的是,当我实现以下代码时,它可用于数据集的其他部分;而不是该特定用户的用户。

ID在int64中,datetimestamp在datetime64 [ns]中,用户在对象中。 我正在使用熊猫24.xx(工作尚未批准最新版本)

df = pd.DataFrame({'ID':[1234,1234,5678, 5678, 4567, 1122],
                   'time':["2017-08-21 09:44:33.555","2017-08-21 09:44:33.555", "2018-08-21 10:44:34.000", "2019-08-21 11:44:34.000", "2016-08-21 12:44:34.000", "2015-08-21 13:44:34.000"],
                   'user':["_HGX87A","_HGX87A","HBA001","THC002","THC002","THC003"],
                   'status':["Incomplete","Active","Pending","Expired","Expired","Expired"],
                  'action' :["paper", "document", "approval", "document", "document", "document"]})


raw = df.copy(deep = True)
test1 = raw[raw.time < "2017-08-22 00:00:00.000"]
test2 = test1[test1.status != "Pending"]
test3 = test2.sort_values(by = ["time"]).drop_duplicates(["ID"], keep = "last")
test3[test3.ID == 1234]


I would expect this:

1   1234    2017-08-21 09:44:33.555     _HGX87A     Active  document

编辑:我发现了这个问题。当我按照上面的时间戳进行排序时,问题是记录的时间戳完全相同。即使它们具有完全相同的时间戳,但1234“未完成”会与1234“活动”交换位置,就好像1234“活动”在前一样。但从逻辑上讲,不可能按此顺序发生事件。

这是熊猫的预期功能吗?我本以为,如果它们相同,它将保持相同的位置(即,保持索引有序)。

第二,如果存在重复的时间戳记,但仍按日期时间排序,是否可以修改上面的代码来维持位置?

0 个答案:

没有答案