按pandas组筛选最近的事件



我正在尝试过滤pandas数据框,以便能够获得数据框中每个帐号的最新数据点。下面是一个数据的示例。我正在寻找一个具有产品和最近日期的帐户实例的输出。

account_number product   sale_date
0             123  rental  2021-12-01
1             423  rental  2021-10-01
2             513    sale  2021-11-02
3             123    sale  2022-01-01
4             513    sale  2021-11-30

我试图使用groupbyidxmax(),但它不工作与日期。

并且我确实想将dtype从日期时间更改。

data_grouped = data.groupby('account_number')['sale_date'].max().idxmax()

任何想法都很棒。

为了保留一个子集数据帧,考虑按账号和销售日期降序排序,然后调用DataFrame.groupby().head(如果每组在第一行,则返回NaNs,而不像DataFrame.groupby().first):

data_grouped = (
data.sort_values(
["account_number", "sale_date"], ascending=[True, False]
).reset_index(drop=True)
.groupby("account_number")
.head(1)
)

似乎sale_date列有字符串。如果您将其转换为日期时间类型,那么您可以使用groupby+idxmax:

df['sale_date'] = pd.to_datetime(df['sale_date'])
out = df.loc[df.groupby('account_number')['sale_date'].idxmax()]

输出:

account_number product  sale_date
3             123    sale 2022-01-01
1             423  rental 2021-10-01
4             513    sale 2021-11-30

关键字" first "会起作用吗?也就是:

data.groupby('account_number')['sale_date'].first()

您需要last关键字来获得分组后的最近日期,如下所示:

df.groupby(by=["account_number"])["sale_date"].last()

将提供如下输出:

account_number
123   2022-01-01
423   2021-10-01
513   2021-11-30
Name: sale_date, dtype: datetime64[ns]

不清楚为什么要从使用datetime dtype转换过来,但是为了正确排序您正在寻找的值,您需要它。考虑将此作为中间步骤,然后在处理后重新格式化该列。

我将把我的答案改为使用@Daniel Weigelbut的答案…还有这里,您可以应用.nth(n)来查找一般情况下的第n个值((-1)表示最近的日期)。

new_data = data.groupby('account_number')['sale_date'].nth(-1)

我之前的建议是用

创建一个排序的多索引
data.set_index(['account_number', 'sale_date'], inplace = True)
data_sorted = data.sort_index(level = [0, 1])

仍然可以工作,并且对于任何更复杂的排序可能更有用。正如其他人所说,如果您这样排序,请确保您的日期字符串是日期时间对象。

最新更新