我有一个很大的数据框,里面有人的信息和他们的工作变更历史。有时,某人在一天内对他们的记录进行了多次更改,每次更改都被分配了一个事务序列号。我只想保留当天事务序列号最高的行。目前,我正在使用下面的for循环来做到这一点,但这需要很长时间。
list_indexes_to_drop = []
for (associate_id, date), df in df_job_his.groupby(["Employee ID", "Event Date"]):
if len(df) > 1:
list_indexes_to_drop += list(df.index[df["Transaction Sequence Number"] != df["Transaction Sequence Number"].max()])
我也有下面的代码,但我不知道如何使用它来过滤数据帧。
df_job_his.groupby(["Employee ID", "Event Date"])["Transaction Sequence Number"].max()
有没有更有效的方法来解决这个问题?
以下是相同格式的一些随机数据的示例:
df_job_his = pd.DataFrame({"Employee ID": [1, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 6, 7, 8, 9, 9, 10], "Event Date": ["2020-04-05", "2020-06-08", "2020-06-08", "2022-09-01", "2022-02-15", "2022-02-15", "2021-07-29", "2021-07-29", "2021-08-14", "2021-09-14", "2022-01-04", "2022-01-04", "2022-01-04", "2022-04-04", "2020-08-13", "2020-08-13", "2020-03-17"], "Transaction Sequence Number": [1, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1]}).groupby(["Employee ID", "Event Date"])
如果你小群几乎是一个正确的答案!
获取具有最高“事务序列号”的值的技巧是在按事务序列号对数据帧进行排序后使用. grouppby.last()
这里有一个解决方案:
import pandas as pd
import numpy as np
df_job_his = pd.DataFrame({
'Employee ID': [0, 0, 0, 0, 1, 1, 1],
'Event Date': [1, 2, 3, 3, 1, 2, 3],
'Transaction Sequence Number': [1, 2, 4, 3, 5, 6, 7],
'Important info about transaction': np.random.random(7)
})
df_job_his.sort_values('Transaction Sequence Number').groupby(
["Employee ID", "Event Date"]).last()
它输出类似这样的内容,其中日期3的员工o仅获取最后一行。