我有一个这样的数据帧,
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",对于其他列
,此列的值为空白。 例如,1/5/2017的值为"W",2017 年 11 月 11 日的值为"W"。其他人将在其中空白。
请帮我解决这个问题。
想法是按ne
、shift
和cumsum
为连续组创建辅助mask
,然后仅过滤D
行并通过Series.duplicated
keep='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