我有两个数据帧,a
和b
b
具有日期时间索引,而a
具有Start
和End
日期时间列
我需要“标记”到True
,所有b
的行的索引都位于[Start,End]
的任何a
间隔之内
现在我正在做
for _,r in a.iterrows():
b.loc[np.logical_and(b.index>=r.Start,
b.index<=r.End),'Label']=True
但是当b大时,这非常慢。
如何优化提供的代码段?
MVCE:
b=pd.DataFrame(index=[pd.Timestamp('2017-01-01'),pd.Timestamp('2018-01-01')],columns=['Label'])
a=pd.DataFrame.from_dict([{'Start':pd.Timestamp('2018-01-01'),'End':pd.Timestamp('2020-01-01')}])
编辑:
解决方案位于 Add/fill pandas column based on range in rows from another dataframe 对我不起作用(在我们处理日期时间时,它们使用范围来填充时间间隔
答案 0 :(得分:1)
这是使用apply
-
虚拟CSV数据
Date,Start,End
01-08-2019,01-02-2019, 01-10-2019
01-08-2019,01-02-2020, 01-10-2020
代码
df = pd.read_csv('dummy.csv').apply(pd.to_datetime)
df.T.apply(lambda x: x[1] < x[0] and x[2] > x[0])
结果
0 True
1 False
dtype: bool
答案 1 :(得分:1)
如何做这样的事情?
def func(): # b.index
mask = (a['Start'] > date) & (a['End'] <= date)
df = a.loc[mask]
if len(df) > 0:
return True
else:
return False
b['Label'] = b.index().to_series().apply(func)