我有以下Pandas DataFrame的例子
UserID Total Date
1 20 2019 01-01
1 18 201901-04
1 22 201901-05
1 16 201901-07
1 17 201901-09
1 26 201901-11
1 30 2019-01-12
1 28 2019-01-13
1 28 2019-01-15
1 28 2019-01-16
2 22 2019-01-06
2 11 201901-07
2 23 201901-09
2 14 201901-13
2 19 2019-01-14
2 29 2019-01-15
2 21 2019-01-16
2 22 2019-01-18
2 30 2019-01-22
2 16 201901-23
3 27 2019-01
3 13 201901-04
3 12 201901-05
3 27 201901-06
3 26 201901-09
3 26 201901-10
3 30 201901-11
3 19 2019-01-12
3 27 201901-13
3 29 201901-14
4 29 2019-01-07
4 12 201901-09
4 25 201901-10
4 11 201901-11
4 19 2019-01-13
4 20 2019-01-14
4 33 201901-15
4 24 201901-18
4 22 201901-19
4 24 201901-21
我的目標是添加一個名為TotalPrev10Days的列,它基本上是Total前10天的總和(針對每個UserID)
。我做了一個基本的實作,使用嵌套回圈并將當前日期與一個時間點進行比較。
以下是我的代碼:
users = set(df.UserID) # get set of all unique user IDs。
TotalPrev10Days = []
delta = timedelta(days=10) # 從每行日期中減去10天時間的delta。
for user in users: # 在所有的用戶ID上進行回圈操作。
user_df = df[df["UserID"] == user) #創建僅包括當前用戶ID資料的資料框架。
for row_index in user_df.index。#looping over each row from UserID dataframe[/span].
row_date = user_df["Date"][row_index]
row_date_minus_10 = row_date - delta #減去10天] [row_index] 。
sum_prev_10_days = user_df[(user_df["Date"] < row_date) & (user_df["Date"] >= row_date_minus_10)]["Total"] 。 sum()
TotalPrev10Days.append(sum_prev_10_days) #appending total to a list。
df["TotalPrev10Days"] = TotalPrev10Days #將串列分配給新的DataFrame列。
雖然它可以完美地作業,但對于大型資料集來說,它非常慢。
對于這個問題,是否有一個更快、更適合Pandas的方法?
uj5u.com熱心網友回復:
IIUC,試試:
df["TotalPrev10Days"/span>] = df.groupby("UserID"/span>)
.rolling("9D"/span>, on="Date")
.sum()
.shift()
.fillna(0)["Total"]
.droplevel(0)
>>> df
用戶ID 總計 日期 總計前10天
0 1 20 2019 01-01 0.0
1 1 18 2019-01-04 20.
2 1 22 2019-01-05 38.0[/span
3 1 16 2019-01-07 60.0[/span
4 1 17 2019-01-09 76.0[/span
5 1 26 2019-01-11 93.0
6 1 30 201901-12 99.0
7 1 28 201901-13 129.0
8 1 28 201901-15 139.0
9 1 28 201901-16 145.0
10 2 22 201901-06 0.0
11 2 11 2019-01-07 22.
12 2 23 2019-01-09 33.0[/span
13 2 14 2019-01-13 56.0
14 2 19 201901-14 70.0
15 2 29 201901-15 89.0
16 2 21 2019-01-16 96.0
17 2 22 2019-01-18 106.0
18 2 30 201901-22 105.0
19 2 16 201901-23 121.0
20 3 27 2019-01-0.
21 3 13 2019-01-04 27.
22 3 12 2019-01-05 40.0[/span
23 3 27 2019-01-06 52.0[/span
24 3 26 2019-01-09 79.0[/span
25 3 26 2019-01-10 105.0
26 3 30 201901-11 104.0
27 3 19 201901-12 134.0
28 3 27 2019-01-13 153.0
29 3 29 2019-01-14 167.0
30 4 29 2019-01-07 0.
31 4 12 2019-01-09 29.0[/span
32 4 25 201901-10 41.0
33 4 11 201901-11 66.0
34 4 19 201901-13 77.0
35 4 20 2019-01-14 96.0
36 4 33 2019-01-15 116.0
37 4 24 201901-18 149.0
38 4 22 2019-01-19 132.0
39 4 24 201901-21 129.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/332427.html
標籤:
