Pandas 如果特定日期范围内的值相同,则删除行
Pandas delete rows if value is same for certain date range
我尝试查找类似的内容,但没找到。所以我有以下结构数据框。我希望删除 5 天或更长时间得分相同的行。因此,在下面的案例中,PeronID AB-123 从 2/1 到 2/6 的记录需要删除,DG-3465 从 2/3 到 2/10 的记录也需要删除。但 TY-9456 没有。
我正在考虑使用 rolling() 但对于 AB-123 只会删除 2/1-2/5 而不是 2/6。
PersonID Date Score
AB-123 2/1/2016 0
AB-123 2/2/2016 0
AB-123 2/3/2016 0
AB-123 2/4/2016 0
AB-123 2/5/2016 0
AB-123 2/6/2016 0
AB-123 2/7/2016 67.5
AB-123 2/8/2016 73.4
AB-123 2/9/2016 70.5
AB-123 2/10/2016 68
DG-3465 2/1/2016 22.5
DG-3465 2/2/2016 25.6
DG-3465 2/3/2016 36.4
DG-3465 2/4/2016 36.4
DG-3465 2/5/2016 36.4
DG-3465 2/6/2016 36.4
DG-3465 2/7/2016 36.4
DG-3465 2/8/2016 36.4
DG-3465 2/9/2016 36.4
DG-3465 2/10/2016 36.4
TY-9456 2/1/2016 0
TY-9456 2/2/2016 0
TY-9456 2/3/2016 5.23
TY-9456 2/4/2016 4.12
TY-9456 2/5/2016 5.95
TY-9456 2/6/2016 6.97
TY-9456 2/7/2016 12.45
TY-9456 2/8/2016 15.61
TY-9456 2/9/2016 15.61
TY-9456 2/10/2016 15.61
尝试了一些不同的东西,但我有点卡住了,脑子里什么都没有。你有什么建议?
顺便用 python pandas ;)
您可以排除那些相差 0 且偏移 1 天的行:
In [11]: df[(df.Score.diff() != 0) | (df.Date.diff() != pd.offsets.Day().delta)]
Out[11]:
PersonID Date Score
0 AB-123 2016-02-01 0.00
6 AB-123 2016-02-07 67.50
7 AB-123 2016-02-08 73.40
8 AB-123 2016-02-09 70.50
9 AB-123 2016-02-10 68.00
10 DG-3465 2016-02-01 22.50
11 DG-3465 2016-02-02 25.60
12 DG-3465 2016-02-03 36.40
20 TY-9456 2016-02-01 0.00
22 TY-9456 2016-02-03 5.23
23 TY-9456 2016-02-04 4.12
24 TY-9456 2016-02-05 5.95
25 TY-9456 2016-02-06 6.97
26 TY-9456 2016-02-07 12.45
27 TY-9456 2016-02-08 15.61
您按 shift 和 cumsum() 分组。编辑以包括@Scott Boston 的建议
df.groupby(['PersonID',(df.Score != df.Score.shift()).cumsum()]).filter(lambda x: x.Score.size < 5)
PersonID Date Score
6 AB-123 2/7/2016 67.50
7 AB-123 2/8/2016 73.40
8 AB-123 2/9/2016 70.50
9 AB-123 2/10/2016 68.00
10 DG-3465 2/1/2016 22.50
11 DG-3465 2/2/2016 25.60
20 TY-9456 2/1/2016 0.00
21 TY-9456 2/2/2016 0.00
22 TY-9456 2/3/2016 5.23
23 TY-9456 2/4/2016 4.12
24 TY-9456 2/5/2016 5.95
25 TY-9456 2/6/2016 6.97
26 TY-9456 2/7/2016 12.45
27 TY-9456 2/8/2016 15.61
28 TY-9456 2/9/2016 15.61
29 TY-9456 2/10/2016 15.61
您可以 roll
在 分数 列上计算 运行 标准差,然后删除标准差为零的行以及五行在它们之前(假设您要删除连续几天具有相同分数的行):
df.drop(np.unique(df.Score.rolling(5).std()[lambda x: x == 0].index.values - pd.np.arange(5)[:, None]))
我尝试查找类似的内容,但没找到。所以我有以下结构数据框。我希望删除 5 天或更长时间得分相同的行。因此,在下面的案例中,PeronID AB-123 从 2/1 到 2/6 的记录需要删除,DG-3465 从 2/3 到 2/10 的记录也需要删除。但 TY-9456 没有。 我正在考虑使用 rolling() 但对于 AB-123 只会删除 2/1-2/5 而不是 2/6。
PersonID Date Score
AB-123 2/1/2016 0
AB-123 2/2/2016 0
AB-123 2/3/2016 0
AB-123 2/4/2016 0
AB-123 2/5/2016 0
AB-123 2/6/2016 0
AB-123 2/7/2016 67.5
AB-123 2/8/2016 73.4
AB-123 2/9/2016 70.5
AB-123 2/10/2016 68
DG-3465 2/1/2016 22.5
DG-3465 2/2/2016 25.6
DG-3465 2/3/2016 36.4
DG-3465 2/4/2016 36.4
DG-3465 2/5/2016 36.4
DG-3465 2/6/2016 36.4
DG-3465 2/7/2016 36.4
DG-3465 2/8/2016 36.4
DG-3465 2/9/2016 36.4
DG-3465 2/10/2016 36.4
TY-9456 2/1/2016 0
TY-9456 2/2/2016 0
TY-9456 2/3/2016 5.23
TY-9456 2/4/2016 4.12
TY-9456 2/5/2016 5.95
TY-9456 2/6/2016 6.97
TY-9456 2/7/2016 12.45
TY-9456 2/8/2016 15.61
TY-9456 2/9/2016 15.61
TY-9456 2/10/2016 15.61
尝试了一些不同的东西,但我有点卡住了,脑子里什么都没有。你有什么建议? 顺便用 python pandas ;)
您可以排除那些相差 0 且偏移 1 天的行:
In [11]: df[(df.Score.diff() != 0) | (df.Date.diff() != pd.offsets.Day().delta)]
Out[11]:
PersonID Date Score
0 AB-123 2016-02-01 0.00
6 AB-123 2016-02-07 67.50
7 AB-123 2016-02-08 73.40
8 AB-123 2016-02-09 70.50
9 AB-123 2016-02-10 68.00
10 DG-3465 2016-02-01 22.50
11 DG-3465 2016-02-02 25.60
12 DG-3465 2016-02-03 36.40
20 TY-9456 2016-02-01 0.00
22 TY-9456 2016-02-03 5.23
23 TY-9456 2016-02-04 4.12
24 TY-9456 2016-02-05 5.95
25 TY-9456 2016-02-06 6.97
26 TY-9456 2016-02-07 12.45
27 TY-9456 2016-02-08 15.61
您按 shift 和 cumsum() 分组。编辑以包括@Scott Boston 的建议
df.groupby(['PersonID',(df.Score != df.Score.shift()).cumsum()]).filter(lambda x: x.Score.size < 5)
PersonID Date Score
6 AB-123 2/7/2016 67.50
7 AB-123 2/8/2016 73.40
8 AB-123 2/9/2016 70.50
9 AB-123 2/10/2016 68.00
10 DG-3465 2/1/2016 22.50
11 DG-3465 2/2/2016 25.60
20 TY-9456 2/1/2016 0.00
21 TY-9456 2/2/2016 0.00
22 TY-9456 2/3/2016 5.23
23 TY-9456 2/4/2016 4.12
24 TY-9456 2/5/2016 5.95
25 TY-9456 2/6/2016 6.97
26 TY-9456 2/7/2016 12.45
27 TY-9456 2/8/2016 15.61
28 TY-9456 2/9/2016 15.61
29 TY-9456 2/10/2016 15.61
您可以 roll
在 分数 列上计算 运行 标准差,然后删除标准差为零的行以及五行在它们之前(假设您要删除连续几天具有相同分数的行):
df.drop(np.unique(df.Score.rolling(5).std()[lambda x: x == 0].index.values - pd.np.arange(5)[:, None]))