Вам нужно только упростить свой код - из df4['Date1'].between(a, b, inclusive=False)
возвращается логическая серия, поэтому нужно только перейти на loc
:
a = df4['Date2'] - pd.Timedelta(2, unit='d')
b = df4['Date2'] + pd.Timedelta(2, unit='d')
mask = df4['Date1'].between(a, b, inclusive=False)
df4['new col'] = df4['Date1']
df4.loc[mask, 'new col'] = 'string'
Лучшая альтернатива с numpy.where
:
df4['new col'] = np.where(mask, 'string', df4['Date1'])
Примечание :
Смешанные значения в одной серии возможны, но тогда производительность должна снизиться, а некоторые функции должны быть нарушены, поэтому будьте осторожны.