微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pandas - 排序、分组、添加列以查看移动的日期窗口

如何解决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']) 参数是

  1. window:一个整数,指定回溯窗口开始的行数
  2. closed:用于指定是否包含窗口结束(在您的情况下,当前行被排除)
  3. 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 举报,一经查实,本站将立刻删除。