提问者:小点点

如何根据groupby中的最大值快速删除行?[重复]


我有一个很大的数据框,里面有人的信息和他们的工作变更历史。有时,某人在一天内对他们的记录进行了多次更改,每次更改都被分配了一个事务序列号。我只想保留当天事务序列号最高的行。目前,我正在使用下面的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"])

共1个答案

匿名用户

如果你小群几乎是一个正确的答案!

获取具有最高“事务序列号”的值的技巧是在按事务序列号对数据帧进行排序后使用. 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仅获取最后一行。