我有一個帶有日期列和 id 列的熊貓資料框。我想回傳每行對應日期前過去 14 天內每行 id 的出現次數。這意味著,我想回傳“1、2、1、2、3、4、1”。我怎樣才能做到這一點?性能很重要,因為資料幀的長度為 200,000 行左右。謝謝 !
| 日期 | ID |
|---|---|
| 2021-01-01 | 1 |
| 2021-01-04 | 1 |
| 2021-01-05 | 2 |
| 2021-01-06 | 2 |
| 2021-01-07 | 1 |
| 2021-01-08 | 1 |
| 2021-01-28 | 1 |
uj5u.com熱心網友回復:
假設輸入按日期排序,您可以使用以下GroupBy.rolling方法:
# only required if date is not datetime type
df['date'] = pd.to_datetime(df['date'])
(df.assign(count=1)
.set_index('date')
.groupby('id')
.rolling('14d')['count'].sum()
.sort_index(level='date').reset_index() #optional if order is not important
)
輸出:
id date count
0 1 2021-01-01 1.0
1 1 2021-01-04 2.0
2 2 2021-01-05 1.0
3 2 2021-01-06 2.0
4 1 2021-01-07 3.0
5 1 2021-01-08 4.0
6 1 2021-01-28 1.0
uj5u.com熱心網友回復:
我不確定這是否是最好的主意,但下面的代碼是我想出的:
from datetime import timedelta
df["date"] = pd.to_datetime(df["date"])
newColumn = []
for index, row in df.iterrows():
endDate = row["date"]
startDate = endDate - timedelta(days=14)
id = row["id"]
summation = df[(df["date"] >= startDate) & (df["date"] <= endDate) & (df["id"] == id)]["id"].count()
newColumn.append(summation)
df["check_column"] = newColumn
df
輸出
| 日期 | ID | 檢查列 | |
|---|---|---|---|
| 0 | 2021-01-01 00:00:00 | 1 | 1 |
| 1 | 2021-01-04 00:00:00 | 1 | 2 |
| 2 | 2021-01-05 00:00:00 | 2 | 1 |
| 3 | 2021-01-06 00:00:00 | 2 | 2 |
| 4 | 2021-01-07 00:00:00 | 1 | 3 |
| 5 | 2021-01-08 00:00:00 | 1 | 4 |
| 6 | 2021-01-28 00:00:00 | 1 | 1 |
解釋
在這種方法中,我用來iterrows回圈遍歷資料框的行。此外,我使用timedelta了從日期列中減去 14 天。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/439404.html
上一篇:熊貓資料透視表計數
下一篇:在范圍內選擇資料框中的列
