python - 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”。其他人将有空白。
请帮我解决这个问题。
解决方案
想法是通过和mask
为连续组创建助手ne
,然后仅过滤行并通过with获取最后一个值,然后通过 排除行:shift
cumsum
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
推荐阅读
- html - Flex 的成长不受儿童大小的影响
- python - 如何使用python中的数学模块生成随机浮点数
- dictionary - 从 terraform 中的 yaml 模板识别地图
- python - 如何让 Apache Airflow 中的 DAG 像简单的 cron 作业一样运行?
- c# - Xamarin.Forms 将默认值绑定到 DisplayPromptAsync
- c - 大师冥想错误:使用自定义库时核心 0 恐慌(加载禁止)
- python - 如何从 python 中的 **kwargs 参数中排除可选参数?
- flutter - setState() 或 markNeedsBuild() 在构建过程中调用。这个 LoginScreenWidget 不能被标记,因为框架已经在构建小部件的过程中
- javascript - 生产模式下未定义的event.target.files react js
- python - 用于大型项目的函数跟踪和内存分析 Python