对于给定的数据帧,如下所示:
id start_date end_date
0 1 2014/5/26 2014/5/27
1 2 2014/6/27 2014/6/28
2 3 2014/7/20 2014/7/21
3 4 2014/9/12 2014/9/13
4 5 2014/10/10 2014/10/11
5 6 2020/3/20 2020/4/21
6 7 2020/4/10 2020/4/11
7 8 2020/4/15 2020/4/16
8 9 2020/3/23 2020/3/24
9 10 2020/4/6 2020/4/7
我想过滤start_date
或end_date
处于2020-02、2020-03、2020-04
范围内的行,感谢您分享除我之外的其他可选解决方案。
前瞻结果将如下所示:
id start_date end_date
5 6 2020-03-20 2020-04-21
6 7 2020-04-10 2020-04-11
7 8 2020-04-15 2020-04-16
9 10 2020-04-06 2020-04-07
问题来源:stackoverflow
我认为这对于按列进行处理是更好的DataFrame.apply
,DataFrame.applymap
用于按元素处理:
df[['start_date', 'end_date']] = (df[['start_date', 'end_date']]
.apply(lambda x: pd.to_datetime(x, format = '%Y/%m/%d')))
然后通过Series.dt.to_period
使用几个月的周期进行过滤:
df = (df[(df['start_date'].dt.to_period('m')== '2020-04') |
(df['end_date'].dt.to_period('m')== '2020-04')])
print (df)
id start_date end_date
5 6 2020-03-20 2020-04-21
6 7 2020-04-10 2020-04-11
7 8 2020-04-15 2020-04-16
9 10 2020-04-06 2020-04-07
通过np.logical_or.reduce
可以按列循环解决,如果有更多列,则解决方案更好:
c = ['start_date', 'end_date']
df[c] = df[c].apply(lambda x: pd.to_datetime(x, format = '%Y/%m/%d'))
df = df[np.logical_or.reduce([df[x].dt.to_period('m')== '2020-04' for x in c])]
print (df)
id start_date end_date
5 6 2020-03-20 2020-04-21
6 7 2020-04-10 2020-04-11
7 8 2020-04-15 2020-04-16
9 10 2020-04-06 2020-04-07
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。