Cómo asignar datos numéricos en categorías / bandejas en el dataframe de Pandas

Acabo de comenzar a codificar en Python, y mis habilidades generales de encoding están bastante oxidadas 🙁 así que, por favor, sea un poco paciente.

Tengo un dataframe de pandas:

MuestraPandas

Tiene alrededor de 3m filas. Hay 3 tipos de unidades de edad: Y, D, W por años, días y semanas. Cualquier persona mayor de 1 año tiene una unidad de edad de Y y mi primer grupo que quiero es <2 años, por lo que todo lo que tengo que probar en Unidades de Edad es Y …

Quiero crear una nueva columna AgeRange y rellenar con los siguientes rangos:

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

así que escribí una función

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' 

Pensé que si pasaba en todo el dataframe recuperaría lo que necesitaba y luego podría crear la columna que quería algo como esto:

 agedetails['age_range'] = ageRange(agedetails) 

PERO cuando bash ejecutar el primer código para crear la función que obtengo:

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

Claramente, no está aceptando el AND, pero creo que escuché en clase que podría usar Y así. Debo estar equivocado, pero entonces, ¿cuál sería la forma correcta de hacer esto?

Entonces, después de recibir ese error, ni siquiera estoy seguro de que el método para pasar un dataframe arroje un error. Supongo que probablemente sí. En qué caso, ¿cómo podría hacer que eso funcione también?

Busco aprender el mejor método, pero parte del mejor método para mí es mantenerlo simple, incluso si eso significa hacer las cosas en un par de pasos …

Con Pandas, debes evitar las operaciones por filas, ya que estas usualmente involucran un bucle ineficiente de nivel de Python. Aquí hay un par de alternativas.

Pandas: pd.cut

Como sugiere @JonClements, puede usar pd.cut para esto, el beneficio aquí es que su nueva columna se convierte en categórica .

Solo necesita definir sus límites (incluidos np.inf ) y los nombres de categoría, luego aplique pd.cut a la columna numérica deseada.

 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: np.digitize

np.digitize proporciona otra solución limpia. La idea es definir sus límites y nombres, crear un diccionario y luego aplicar np.digitize a su columna Age. Finalmente, use su diccionario para mapear los nombres de sus categorías.

Tenga en cuenta que para los casos de límite, el límite inferior se utiliza para la asignación a un contenedor.

 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)) 

Resultado

  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+