首页 > 解决方案 > Pandas - 基于一周的最后一个工作日的条件列创建

问题描述

我有一个这样的数据框,

date       day_of_wk    wk_num  wkend_hol_ind   freq_daily
1/1/2007    Monday        1         H   
1/2/2007    Tuesday       1         H   
1/3/2007    Wednesday     1                       D
1/4/2007    Thursday      1                       D
1/5/2007    Friday        1                       D
1/6/2007    Saturday      1         W   
1/7/2007    Sunday        1         W   
1/8/2007    Monday        2                       D
1/9/2007    Tuesday       2                       D
1/10/2007   Wednesday     2                       D
1/11/2007   Thursday      2                       D
1/12/2007   Friday        2         H     
1/13/2007   Saturday      2         W
1/14/2007   Sunday        2         W

我正在尝试在数据框中创建一个新列作为“freq_weekly”。

对于“wk_num”的每个值,该列的最后一个值“D”的值为“W”,其他列的值为空白。

例如,2017 年 1 月 5 日的值为“W”,2017 年 1 月 11 日的值为“W”。其他人将有空白。

请帮我解决这个问题。

标签: pythonpandas

解决方案


想法是通过和mask为连续组创建助手ne,然后仅过滤行并通过with获取最后一个值,然后通过 排除行:shiftcumsumDSeries.duplicatedkeep='last'Series.reindex

m = df['freq_daily'].eq('D')
mask = m.ne(m.shift()).cumsum()[m].duplicated(keep='last').reindex(df.index, fill_value=True)

如果需要测试更多列的重复项:

mask = (df.assign(m=m.ne(m.shift()).cumsum())[m]
          .duplicated(['wk_num','freq_daily'],keep='last')
          .reindex(df.index, fill_value=True))

因此可以通过以下方式创建新列numpy.where

df['freq_weekly'] = np.where(mask, '', 'W')
print (df)
         date  day_of_wk  wk_num wkend_hol_ind freq_daily freq_weekly
0    1/1/2007     Monday       1             H        NaN            
1    1/2/2007    Tuesday       1             H        NaN            
2    1/3/2007  Wednesday       1           NaN          D            
3    1/4/2007   Thursday       1           NaN          D            
4    1/5/2007     Friday       1           NaN          D           W
5    1/6/2007   Saturday       1             W        NaN            
6    1/7/2007     Sunday       1             W        NaN            
7    1/8/2007     Monday       2           NaN          D            
8    1/9/2007    Tuesday       2           NaN          D            
9   1/10/2007  Wednesday       2           NaN          D            
10  1/11/2007   Thursday       2           NaN          D           W
11  1/12/2007     Friday       2             H        NaN            
12  1/13/2007   Saturday       2             W        NaN            
13  1/14/2007     Sunday       2             W        NaN            

推荐阅读