I’m on the last step of finishing my table, but my count is returning NaN. I’m trying to create a column target_days which groups by each value in ‘month_start_date’ and returns the value of the count of workday if True.
For example, each date that has a month_start_date of 2018-08-01 should return a value of 23 because there are 23 workdays in that month. Any help is appreciated!
JavaScript
x
31
31
1
import pandas as pd
2
import numpy as np
3
import datetime as dt
4
from pandas.tseries.holiday import USFederalHolidayCalendar as holidaylist
5
6
datelist = pd.date_range(start='2018-08-01', end=dt.datetime.today())
7
weekdaylist = pd.date_range(start='2018-08-01', end=dt.datetime.today(), freq='B')
8
mstartlist = (datelist + dt.timedelta(1)) + pd.tseries.offsets.MonthBegin(n=-1)
9
10
hl = holidaylist()
11
holidays = hl.holidays(start=datelist.min(), end=datelist.max())
12
13
df = pd.DataFrame(datelist, columns = ['date'])
14
15
df['weekday'] = df.date.isin(weekdaylist)
16
17
df['holiday'] = df.date.isin(holidays)
18
19
df['workday'] = np.where((df.weekday == False) | (df.holiday == True), False, True)
20
21
df['month_start_date'] = mstartlist
22
23
df['target_days'] = df.groupby('month_start_date')['workday'].apply(lambda x: x[x == True].count())
24
25
date weekday holiday workday month_start_date target_days
26
0 2018-08-01 True False True 2018-08-01 NaN
27
1 2018-08-02 True False True 2018-08-01 NaN
28
2 2018-08-03 True False True 2018-08-01 NaN
29
3 2018-08-04 False False False 2018-08-01 NaN
30
4 2018-08-05 False False False 2018-08-01 NaN
31
Advertisement
Answer
Solution with groupby() and .transform(). Based on the response in this thread,
JavaScript
1
5
1
"As a general rule when using groupby(), if you use the .transform()
2
function pandas will return a table with the same length as your
3
original. When you use other functions like .sum() or .first() then
4
pandas will return a table where each row is a group."
5
With that as a way to move forward, I was able to get the right solution.
JavaScript
1
2
1
df['target_days'] = df.groupby('month_start_date')['workday'].transform('sum')
2
The output of this is correct. The sample for month 2021-01-01 shows:
JavaScript
1
15
15
1
date weekday holiday workday month_start_date target_days
2
884 2021-01-01 True True False 2021-01-01 8
3
885 2021-01-02 False False False 2021-01-01 8
4
886 2021-01-03 False False False 2021-01-01 8
5
887 2021-01-04 True False True 2021-01-01 8
6
888 2021-01-05 True False True 2021-01-01 8
7
889 2021-01-06 True False True 2021-01-01 8
8
890 2021-01-07 True False True 2021-01-01 8
9
891 2021-01-08 True False True 2021-01-01 8
10
892 2021-01-09 False False False 2021-01-01 8
11
893 2021-01-10 False False False 2021-01-01 8
12
894 2021-01-11 True False True 2021-01-01 8
13
895 2021-01-12 True False True 2021-01-01 8
14
896 2021-01-13 True False True 2021-01-01 8
15
The first 100 rows have correct value count for holiday = True
:
JavaScript
1
94
94
1
date weekday holiday workday month_start_date target_days
2
0 2018-08-01 True False True 2018-08-01 23
3
1 2018-08-02 True False True 2018-08-01 23
4
2 2018-08-03 True False True 2018-08-01 23
5
3 2018-08-04 False False False 2018-08-01 23
6
4 2018-08-05 False False False 2018-08-01 23
7
5 2018-08-06 True False True 2018-08-01 23
8
6 2018-08-07 True False True 2018-08-01 23
9
7 2018-08-08 True False True 2018-08-01 23
10
8 2018-08-09 True False True 2018-08-01 23
11
9 2018-08-10 True False True 2018-08-01 23
12
10 2018-08-11 False False False 2018-08-01 23
13
11 2018-08-12 False False False 2018-08-01 23
14
12 2018-08-13 True False True 2018-08-01 23
15
13 2018-08-14 True False True 2018-08-01 23
16
14 2018-08-15 True False True 2018-08-01 23
17
15 2018-08-16 True False True 2018-08-01 23
18
16 2018-08-17 True False True 2018-08-01 23
19
17 2018-08-18 False False False 2018-08-01 23
20
18 2018-08-19 False False False 2018-08-01 23
21
19 2018-08-20 True False True 2018-08-01 23
22
20 2018-08-21 True False True 2018-08-01 23
23
21 2018-08-22 True False True 2018-08-01 23
24
22 2018-08-23 True False True 2018-08-01 23
25
23 2018-08-24 True False True 2018-08-01 23
26
24 2018-08-25 False False False 2018-08-01 23
27
25 2018-08-26 False False False 2018-08-01 23
28
26 2018-08-27 True False True 2018-08-01 23
29
27 2018-08-28 True False True 2018-08-01 23
30
28 2018-08-29 True False True 2018-08-01 23
31
29 2018-08-30 True False True 2018-08-01 23
32
30 2018-08-31 True False True 2018-08-01 23
33
31 2018-09-01 False False False 2018-09-01 19
34
32 2018-09-02 False False False 2018-09-01 19
35
33 2018-09-03 True True False 2018-09-01 19
36
34 2018-09-04 True False True 2018-09-01 19
37
35 2018-09-05 True False True 2018-09-01 19
38
36 2018-09-06 True False True 2018-09-01 19
39
37 2018-09-07 True False True 2018-09-01 19
40
38 2018-09-08 False False False 2018-09-01 19
41
39 2018-09-09 False False False 2018-09-01 19
42
40 2018-09-10 True False True 2018-09-01 19
43
41 2018-09-11 True False True 2018-09-01 19
44
42 2018-09-12 True False True 2018-09-01 19
45
43 2018-09-13 True False True 2018-09-01 19
46
44 2018-09-14 True False True 2018-09-01 19
47
45 2018-09-15 False False False 2018-09-01 19
48
46 2018-09-16 False False False 2018-09-01 19
49
47 2018-09-17 True False True 2018-09-01 19
50
48 2018-09-18 True False True 2018-09-01 19
51
49 2018-09-19 True False True 2018-09-01 19
52
50 2018-09-20 True False True 2018-09-01 19
53
51 2018-09-21 True False True 2018-09-01 19
54
52 2018-09-22 False False False 2018-09-01 19
55
53 2018-09-23 False False False 2018-09-01 19
56
54 2018-09-24 True False True 2018-09-01 19
57
55 2018-09-25 True False True 2018-09-01 19
58
56 2018-09-26 True False True 2018-09-01 19
59
57 2018-09-27 True False True 2018-09-01 19
60
58 2018-09-28 True False True 2018-09-01 19
61
59 2018-09-29 False False False 2018-09-01 19
62
60 2018-09-30 False False False 2018-09-01 19
63
61 2018-10-01 True False True 2018-10-01 22
64
62 2018-10-02 True False True 2018-10-01 22
65
63 2018-10-03 True False True 2018-10-01 22
66
64 2018-10-04 True False True 2018-10-01 22
67
65 2018-10-05 True False True 2018-10-01 22
68
66 2018-10-06 False False False 2018-10-01 22
69
67 2018-10-07 False False False 2018-10-01 22
70
68 2018-10-08 True True False 2018-10-01 22
71
69 2018-10-09 True False True 2018-10-01 22
72
70 2018-10-10 True False True 2018-10-01 22
73
71 2018-10-11 True False True 2018-10-01 22
74
72 2018-10-12 True False True 2018-10-01 22
75
73 2018-10-13 False False False 2018-10-01 22
76
74 2018-10-14 False False False 2018-10-01 22
77
75 2018-10-15 True False True 2018-10-01 22
78
76 2018-10-16 True False True 2018-10-01 22
79
77 2018-10-17 True False True 2018-10-01 22
80
78 2018-10-18 True False True 2018-10-01 22
81
79 2018-10-19 True False True 2018-10-01 22
82
80 2018-10-20 False False False 2018-10-01 22
83
81 2018-10-21 False False False 2018-10-01 22
84
82 2018-10-22 True False True 2018-10-01 22
85
83 2018-10-23 True False True 2018-10-01 22
86
84 2018-10-24 True False True 2018-10-01 22
87
85 2018-10-25 True False True 2018-10-01 22
88
86 2018-10-26 True False True 2018-10-01 22
89
87 2018-10-27 False False False 2018-10-01 22
90
88 2018-10-28 False False False 2018-10-01 22
91
89 2018-10-29 True False True 2018-10-01 22
92
90 2018-10-30 True False True 2018-10-01 22
93
91 2018-10-31 True False True 2018-10-01 22
94