На мой взгляд, вы не должны использовать вложенные if
/ else
предложения для этой задачи.
Решение Pandas
Как предлагает @JonClements, вы также можете использовать pandas.cut
для этого, преимущество в том, что ваш новый столбец становится категориальным .
Вам нужно только определить свои границы (в том числе np.inf
) и имена категорий, затем примените pandas.cut
к нужной числовой колонке.
bins = [0, 2, 18, 35, 65, np.inf]
names = ['<2', '2-18', '18-35', '35-65', '65+']
df['AgeRange'] = pd.cut(df['Age'], bins, labels=names)
print(df.dtypes)
# Age int64
# Age_units object
# AgeRange category
# dtype: object
Решение Numpy
numpy.digitize
предоставляет другое чистое решение. Идея состоит в том, чтобы определить ваши границы и имена, создать словарь, а затем применить np.digitize
к столбцу «Возраст». Наконец, используйте словарь для сопоставления имен вашей категории.
Обратите внимание, что для граничных случаев нижняя граница используется для отображения в ячейку.
import pandas as pd, numpy as np
df = pd.DataFrame({'Age': [99, 53, 71, 84, 84],
'Age_units': ['Y', 'Y', 'Y', 'Y', 'Y']})
bins = [0, 2, 18, 35, 65]
names = ['<2', '2-18', '18-35', '35-65', '65+']
d = dict(enumerate(names, 1))
df['AgeRange'] = list(map(d.get, np.digitize(df['Age'], bins)))
Результат
Age Age_units AgeRange
0 99 Y 65+
1 53 Y 35-65
2 71 Y 65+
3 84 Y 65+
4 84 Y 65+
Это не устарело и вряд ли будет. Это стандартный способ, например, сделать часть одного или нескольких изменений зеркал объекта, сделанных для другого, вместо копирования существующих данных.
Это называется присвоением по ссылке, которое, цитируя руководство, "означает, что обе переменные в конечном итоге указывают на одни и те же данные, и ничто не копируется нигде" .
Единственное, что является устаревшим с =&
«присваивает результат new
ссылкой» в PHP & nbsp; 5 , который может быть источником какой-либо путаницы. new
автоматически назначается ссылкой, поэтому &
является избыточным / устаревшим в $o = &new C;
, но не в $o = &$c;
.
Так как его трудно найти, обратите внимание, что =&
( равно амперсанду ) совпадает с = &
( равно амперсанду пространства ) и часто записывается так, что он попадает в другую переменную типа $x = &$y['z'];
или $x = &$someVar
( имя переменной амперсанда и знака доллара ). Пример, упрощенный из документов:
$a = 3;
$b = &$a;
$a = 4;
print "$b"; // prints 4
Вот удобная ссылка на подробный раздел по Assign By Reference в руководстве по PHP . Эта страница является частью серии по ссылкам - стоит потратить минуту, чтобы прочитать всю серию.
$x = &$y['z'];
также имеет эффект создания $y['z']
, если он не существует, и установите его на null
.
Это предотвращает сообщения об ошибках, которые вы, возможно, хотели прочитать. Я еще не нашел документацию по этому поводу; возможно, новый в 5.3, насколько мне известно.