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