новая база столбцов на основе существующих значений столбцов - PullRequest
1 голос
/ 20 апреля 2019

Попытка создать новые значения Chill или Frozen на основе существующих значений столбца "Temp".

Temp содержит значения, такие как:

-18.00C
-20.00C
+10.00C
+19.00C
Nan
DRY

Как это можно реализовать с помощью панд

df = pd.DataFrame({'Temp': ['-18.00C', '+10.00c', 'NaN', 'DRY']})

Если Temp равен <0,0C, он упадет до <code>Frozen
Если Temp> 0,0C, он упадет ниже Chill
Если Temp равно "Nan" или "DRY", оно будет находиться под NA

Ожидаемые результаты:

Temp_Category
Frozen
Chill
NA
NA

1 Ответ

0 голосов
/ 20 апреля 2019

Вы можете извлечь первое значение и 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
...