У меня есть фрейм данных, как показано ниже:
+--------------+--------------+----+-----+-------+
| x1 | x2 | km | gmm | class |
+--------------+--------------+----+-----+-------+
| 180.9863129 | -0.266379416 | 24 | 19 | T |
| 52.20132828 | 28.93587875 | 16 | 14 | I |
| -17.17127419 | 29.97013283 | 17 | 16 | D |
| 37.28710938 | -69.96691132 | 3 | 6 | N |
| -132.2395782 | 27.02541733 | 15 | 18 | G |
| -12.52811623 | -87.90951538 | 22 | 5 | S |
Классы в основном представляют собой алфавиты (от A до Z). Однако мне нужен результат вроде A = 1, B = 2 ... Z = 26.
Теперь, для обычного списка Python, я могу преобразовать их как ord(c.lower()) - ord('a')) % 9) + 1
Однако как это сделать в фреймворке данных






Опция 1
Предполагая, что в вашем столбце Только есть одиночные символы в верхнем регистре, вы можете выполнить небольшую арифметику на view:
df['class'] = df['class'].values.astype('<U1').view(np.uint32) - 64
df
x1 x2 km gmm class
0 180.986313 -0.266379 24 19 20
1 52.201328 28.935879 16 14 9
2 -17.171274 29.970133 17 16 4
3 37.287109 -69.966911 3 6 14
4 -132.239578 27.025417 15 18 7
5 -12.528116 -87.909515 22 5 19
Это самый быстрый метод, который я могу придумать для для больших данных.
Если есть вероятность, что у вас нестабильные данные, вы можете рассмотреть такой шаг предварительной обработки:
df['class'] = df['class'].str.upper().str[0]
Вариант 2ord
df['class'] = [ord(c) - 64 for c in df['class']]
Или же,
df['class'] = df['class'].apply(ord) - 64
df
x1 x2 km gmm class
0 180.986313 -0.266379 24 19 20
1 52.201328 28.935879 16 14 9
2 -17.171274 29.970133 17 16 4
3 37.287109 -69.966911 3 6 14
4 -132.239578 27.025417 15 18 7
5 -12.528116 -87.909515 22 5 19
Здесь используется string с map
import string
df['class'].map(dict(zip(list(string.ascii_uppercase),list(range(1,27)))))
Out[1155]:
0 20
1 9
2 4
3 14
4 7
5 19
Name: class, dtype: int64