Как сопоставить числовые данные в категории / корзины в кадре данных Pandas

Я только начал кодирование в python, и мои общие навыки кодирования довольно ржавые: (так что, пожалуйста, будьте немного терпеливы

У меня есть панда данных:

SamplePandas

Он имеет около 3 м строк. Существует 3 вида age_units: Y, D, W в течение многих лет, дней и недель. Любой человек старше 1 года имеет возрастную единицу Y, и моя первая группа, которую я хочу, – это <2y old, поэтому все, что я должен проверить в Age Units, это Y …

Я хочу создать новый столбец AgeRange и заполнить следующие диапазоны:

  • <2
  • 2 – 18
  • 18 – 35
  • 35 – 65
  • 65+

поэтому я написал функцию

def agerange(values): for i in values: if complete.Age_units == 'Y': if complete.Age > 1 AND  17 AND  34 AND  64 return '65+' else return '< 2' 

Я думал, что если бы я прошел в dataframe в целом, я бы получил то, что мне было нужно, а затем смог создать столбец, который мне нужен, например:

 agedetails['age_range'] = ageRange(agedetails) 

НО, когда я пытаюсь запустить первый код для создания функции, я получаю:

  File "", line 4 if complete.Age > 1 AND complete.Age < 18 return '2-18' ^ SyntaxError: invalid syntax 

Ясно, что он не принимает И – но я думал, что слышал в classе, который я мог использовать И как это? Я должен ошибаться, но тогда, каков был бы правильный способ сделать это?

Поэтому, получив эту ошибку, я даже не уверен, что метод передачи в dataframe также вызовет ошибку. Думаю, наверное, да. В каком случае – как я мог бы сделать эту работу?

Я ищу, чтобы изучить лучший метод, но часть лучшего метода для меня – это просто, даже если это означает делать что-то в двух шагах …

На мой взгляд, вы не должны использовать вложенные аргументы 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.digitize предоставляет другое чистое решение. Идея состоит в том, чтобы определить ваши границы и имена, создать словарь, а затем применить np.digitize к столбцу Age. Наконец, используйте словарь для отображения имен ваших категорий.

Заметим, что для граничных случаев нижняя граница используется для отображения в бин.

 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'] = np.vectorize(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+ 
  • Что означает эллипсис в списке?
  • Почему PySpark не может найти py4j.java_gateway?
  • Python 2.7: streamовый HTTP-сервер, поддерживающий несколько соединений на одном порту
  • Как перейти на новую веб-страницу в Selenium?
  • Как я могу предотвратить изменение размера windows с помощью tkinter?
  • Python Pandas добавляет столбец для максимального количества строк по выбранным столбцам
  • ImportError при импорте некоторых модhive из SciPY
  • Использование моего собственного корпуса вместо movie_reviews corpus для classификации в NLTK
  • обнаружить нажатие клавиши в python?
  • Python pandas groupby метод применить метод дублирует первую группу
  • переносимый способ записи csv-файла в python 2 или python 3
  • Interesting Posts
    Давайте будем гением компьютера.