不幸的是,我无法发布实际的数据集,但这是我的问题的一个示例。我进行基本过滤时遇到问题。
我偶然发现了这个(很幸运?)。每当我在较小版本的数据集上实施以下代码时,我都会得到正确的输出。在这种情况下,记录显示在底部。
但是,当我在较大的数据集(数百万条记录)上实现此代码时,没有得到该结果,而是得到了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“活动”在前一样。但从逻辑上讲,不可能按此顺序发生事件。
这是熊猫的预期功能吗?我本以为,如果它们相同,它将保持相同的位置(即,保持索引有序)。
第二,如果存在重复的时间戳记,但仍按日期时间排序,是否可以修改上面的代码来维持位置?