如何解决Pandas - 排序、分组、添加列以查看移动的日期窗口
我很难理解如何实现移动窗口并创建一个带有二进制值的新列来检查条件(即过去 1 天、2 天、每位员工 3 天,以此类推)。我很擅长排序和分组,但不太确定如何使用日期列作为滑动窗口,还考虑到某些日期采用不同的格式(即 1
) .
我想要完成的是让它查看 "2nd Shift"
列,如果在过去 x 天中至少有一个 'outcome'
,则输入 1。但需要 1
groupby
并以正确的日期顺序回顾 x 天(或者我想如果它正确排序,可以回顾 x 行,看起来排序确实如此)
这是一个示例数据集
'employee_id'
sort_values 似乎按顺序部分地得到它,所以有那个问题。我对 groupby 和滑动窗口感到困扰。我可以通过迭代来实现,但这对于大型数据集来说似乎效率不高。
employee_id = ['405395']*15 + ['405399'] *15
time_et = ['04-03-2021 09:07 PM','04-04-2021 08:37 PM','04-05-2021 09:38 PM','04-10-2021 07:07 PM','04-11-2021 01:07 PM','04-12-2021 08:10 PM','04-06-2021 04:07 PM','04-08-2021 07:07 PM','04-09-2021 07:07 PM','04-13-2021 08:10 PM','04-14-2021 02:10 PM','04-14-2021 2nd Shift','04-17-2021 09:07 PM','04-18-2021 04:07 PM','04-19-2021 09:38 PM','04-03-2021 09:07 PM','04-08-2021 2nd Shift','04-08-2021 02:07 PM','04-16-2021 09:38 PM','04-19-2021 09:38 PM']
outcome =[1,1,0]
df = pd.DataFrame({'employee_id':employee_id,'time_et':time_et,'outcome':outcome})
似乎有效
df = df.sort_values(['employee_id','time_et']).reset_index(drop=True)
注意看到我的尝试:我几乎有它
print(df)
employee_id time_et outcome
0 405395 04-03-2021 09:07 PM 1
1 405395 04-04-2021 08:37 PM 1
2 405395 04-05-2021 09:38 PM 0
3 405395 04-06-2021 04:07 PM 0
4 405395 04-08-2021 07:07 PM 1
5 405395 04-09-2021 07:07 PM 0
6 405395 04-10-2021 07:07 PM 0
7 405395 04-11-2021 01:07 PM 0
8 405395 04-12-2021 08:10 PM 1
9 405395 04-13-2021 08:10 PM 0
10 405395 04-14-2021 02:10 PM 0
11 405395 04-14-2021 2nd Shift 1
12 405395 04-17-2021 09:07 PM 0
13 405395 04-18-2021 04:07 PM 0
14 405395 04-19-2021 09:38 PM 0
15 405399 04-03-2021 09:07 PM 1
16 405399 04-04-2021 08:37 PM 1
17 405399 04-05-2021 09:38 PM 0
18 405399 04-06-2021 04:07 PM 1
19 405399 04-08-2021 02:07 PM 0
20 405399 04-08-2021 2nd Shift 0
21 405399 04-10-2021 07:07 PM 0
22 405399 04-11-2021 01:07 PM 0
23 405399 04-12-2021 08:10 PM 0
24 405399 04-13-2021 08:10 PM 1
25 405399 04-14-2021 02:10 PM 0
26 405399 04-16-2021 09:38 PM 1
27 405399 04-17-2021 09:07 PM 1
28 405399 04-18-2021 04:07 PM 1
29 405399 04-19-2021 09:38 PM 0
我的尝试:这几乎可以理解,除了每个 print(df.to_string())
employee_id time_et outcome 1_day 2_day 3_day 4_day 5_day
0 405395 04-03-2021 09:07 PM 1 NaN NaN NaN NaN NaN
1 405395 04-04-2021 08:37 PM 1 1.0 1.0 1.0 1.0 1.0
2 405395 04-05-2021 09:38 PM 0 1.0 1.0 1.0 1.0 1.0
3 405395 04-06-2021 04:07 PM 0 0.0 1.0 1.0 1.0 1.0
4 405395 04-08-2021 07:07 PM 1 0.0 0.0 1.0 1.0 1.0
5 405395 04-09-2021 07:07 PM 0 1.0 1.0 1.0 1.0 1.0
6 405395 04-10-2021 07:07 PM 0 0.0 1.0 1.0 1.0 1.0
7 405395 04-11-2021 01:07 PM 0 0.0 0.0 1.0 1.0 1.0
8 405395 04-12-2021 08:10 PM 1 0.0 0.0 0.0 1.0 1.0
9 405395 04-13-2021 08:10 PM 0 1.0 1.0 1.0 1.0 1.0
10 405395 04-14-2021 02:10 PM 0 0.0 1.0 1.0 1.0 1.0
11 405395 04-14-2021 2nd Shift 1 0.0 0.0 1.0 1.0 1.0
12 405395 04-17-2021 09:07 PM 0 1.0 1.0 1.0 1.0 1.0
13 405395 04-18-2021 04:07 PM 0 0.0 1.0 1.0 1.0 1.0
14 405395 04-19-2021 09:38 PM 0 0.0 0.0 0.0 1.0 1.0
15 405399 04-03-2021 09:07 PM 1 NaN NaN NaN NaN NaN
16 405399 04-04-2021 08:37 PM 1 1.0 1.0 1.0 1.0 1.0
17 405399 04-05-2021 09:38 PM 0 1.0 1.0 1.0 1.0 1.0
18 405399 04-06-2021 04:07 PM 1 0.0 1.0 1.0 1.0 1.0
19 405399 04-08-2021 02:07 PM 0 1.0 1.0 1.0 1.0 1.0
20 405399 04-08-2021 2nd Shift 0 0.0 1.0 1.0 1.0 1.0
21 405399 04-10-2021 07:07 PM 0 0.0 0.0 1.0 1.0 1.0
22 405399 04-11-2021 01:07 PM 0 0.0 0.0 0.0 1.0 1.0
23 405399 04-12-2021 08:10 PM 0 0.0 0.0 0.0 1.0 1.0
24 405399 04-13-2021 08:10 PM 1 0.0 0.0 0.0 0.0 1.0
25 405399 04-14-2021 02:10 PM 0 1.0 1.0 1.0 1.0 1.0
26 405399 04-16-2021 09:38 PM 1 0.0 1.0 1.0 1.0 1.0
27 405399 04-17-2021 09:07 PM 1 1.0 1.0 1.0 1.0 1.0
28 405399 04-18-2021 04:07 PM 1 1.0 1.0 1.0 1.0 1.0
29 405399 04-19-2021 09:38 PM 0 1.0 1.0 1.0 1.0 1.0
的第一行不为空。那么我如何让这些为空?
employee_id
解决方法
要使用滚动时间范围,首先将 brew install openblas
pip3 install cython
OPENBLAS="$(brew --prefix openblas)" pip3 install numpy --no-use-pep517
OPENBLAS="$(brew --prefix openblas)" pip3 install pandas --no-use-pep517
设置为时间值,以便我们可以适当地对数据帧进行排序。
df.index
然后使用滚动和分组在循环中分配其他列。
相关的 df.index = pd.to_datetime(
df.time_et.str.replace('2nd Shift','11:59 PM',regex=False).rename('idx')
)
df = df.sort_values(['employee_id','idx'])
参数是
- window:一个整数,指定回溯窗口开始的行数
- closed:用于指定是否包含窗口结束(在您的情况下,当前行被排除)
- min_periods:计算产生值所需的最小窗口大小。这默认为
rolling
值,因此我们必须手动设置它。
window
这会产生以下数据框,您可以删除索引,现在已执行滚动计算。
for i in [1,2,3,4,5]:
df[f'{i}_day'] = df.groupby('employee_id').rolling(
window=i,min_periods=1,closed='left'
).outcome.max().values
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。