我正在尝试过滤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
我试图使用groupby
和idxmax()
,但它不工作与日期。
并且我确实想将dtype从日期时间更改。
data_grouped = data.groupby('account_number')['sale_date'].max().idxmax()
任何想法都很棒。
为了保留一个子集数据帧,考虑按账号和销售日期降序排序,然后调用DataFrame.groupby().head
(如果每组在第一行,则返回NaN
s,而不像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])
仍然可以工作,并且对于任何更复杂的排序可能更有用。正如其他人所说,如果您这样排序,请确保您的日期字符串是日期时间对象。