我正在嘗試過濾熊貓資料框,以便能夠獲取資料框中每個帳號的最新資料點。以下是資料外觀的示例。我正在尋找一個包含產品和最近日期的帳戶實體的輸出。
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()
任何想法都會很棒。
uj5u.com熱心網友回復:
該sale_date列似乎有字串。如果將其轉換為 datetime dtype,則可以使用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
uj5u.com熱心網友回復:
關鍵字“第一”會起作用嗎?所以那將是:
data.groupby('account_number')['sale_date'].first()
uj5u.com熱心網友回復:
要保留子集資料框,請考慮按帳號和降序銷售日期排序,然后呼叫(如果在每組的第一行中DataFrame.groupby().head回傳s 與 不同):NaNDataFrame.groupby().first
data_grouped = (
data.sort_values(
["account_number", "sale_date"], ascending=[True, False]
).reset_index(drop=True)
.groupby("account_number")
.head(1)
)
uj5u.com熱心網友回復:
您需要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,但您需要它才能正確排序您要查找的值。考慮將此作為中間步驟,然后在處理后重新格式化列。
uj5u.com熱心網友回復:
我將更改我的答案以使用@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])
仍然有效,并且對于任何更復雜的排序可能更有用。正如其他人所說,如果您像這樣排序,請確保您的日期字串是日期時間物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/464725.html
標籤:Python 熊猫 日期 筛选 熊猫-groupby
