Используйте Series.str.extract
для получения лет в новый столбец с преобразованием в числа с плавающей запятой:
df = pd.DataFrame({'IO8':['2000','2009','20','dwd21']})
df['num'] = df['IO8'].str.extract("(^\d{4}$)").astype(float)
Тогда возможно использование numpy.select
для 3 состояний:
m1 = df['num'].notna()
m2 = df['num'] >= 2002
df['split1'] = pd.np.select([m1 & m2, m1 & ~m2],["NEW","OLD"], default='no match')
Или используйте double np.where
:
df['split1'] = pd.np.where(m2, "NEW", pd.np.where(m1, "OLD", 'no match'))
print (df)
IO8 num split1
0 2000 2000.0 OLD
1 2009 2009.0 NEW
2 20 NaN no match
3 dwd21 NaN no match
Потому что, если использовать только np.where
, выведите:
df = pd.DataFrame({'IO8':['2000','2009','20','dwd21']})
df['num'] = df['IO8'].str.extract("(^\d{4}$)").astype(float)
m1 = df['num'].notna()
m2 = df['num'] >= 2002
df['split1'] = pd.np.where(m1 & m2, "NEW","OLD")
print (df)
IO8 num split1
0 2000 2000.0 OLD
1 2009 2009.0 NEW
2 20 NaN OLD
3 dwd21 NaN OLD