Вы можете извлечь первое значение и Series.map
по словарю, но всегда необходимые значения +
и -
перед цифрами.
df = pd.DataFrame({'Temp': ['-18.00C', '+10.00c', 'NaN', 'DRY', '+0c', '20c']})
d = {'-':'Frozen', '+':'Chill'}
df['new1'] = df['Temp'].str[0].map(d)
Другая идея - извлечь числовое значение, преобразуйте в float
и используйте numpy.sign
, но если есть 0
, то вывод тоже 0
, поэтому вывод NaN
:
pat = r"([-+]?\d*\.\d+|\d+)"
d1 = {1:'Chill', -1:'Frozen', 0:'Chill'}
df['new2'] = np.sign(df['Temp'].str.extract(pat, expand=False).astype(float)).map(d1)
Решение с 2
условия и numpy.select
:
pat = r"([-+]?\d*\.\d+|\d+)"
s = df['Temp'].str.extract(pat).astype(float)
df['new3'] = np.select([s >= 0, s < 0], ['Chill','Frozen'], default=np.nan)
И если только последнее значение температуры не является числовым (например, c
или C
), можно использовать to_numeric
с удалением последнего символа путем индексации:
s = pd.to_numeric(df['Temp'].str[:-1], errors='coerce')
df['new4'] = np.select([s >= 0, s < 0], ['Chill','Frozen'], default=np.nan)
print (df)
Temp new1 new2 new3 new4
0 -18.00C Frozen Frozen Frozen Frozen
1 +10.00c Chill Chill Chill Chill
2 NaN NaN NaN nan nan
3 DRY NaN NaN nan nan
4 +0c Chill Chill Chill Chill
5 20c NaN Chill Chill Chill