Cambie el nombre de las categorías menos frecuentes por “OTRA” python

En mi dataframe tengo algunas columnas categóricas con más de 100 categorías diferentes. Quiero clasificar las categorías por las más frecuentes. Guardo las primeras 9 categorías más frecuentes y las menos frecuentes cambian de nombre automáticamente: OTROS

Ejemplo:

Aquí mi df:

print(df) Employee_number Jobrol 0 1 Sales Executive 1 2 Research Scientist 2 3 Laboratory Technician 3 4 Sales Executive 4 5 Research Scientist 5 6 Laboratory Technician 6 7 Sales Executive 7 8 Research Scientist 8 9 Laboratory Technician 9 10 Sales Executive 10 11 Research Scientist 11 12 Laboratory Technician 12 13 Sales Executive 13 14 Research Scientist 14 15 Laboratory Technician 15 16 Sales Executive 16 17 Research Scientist 17 18 Research Scientist 18 19 Manager 19 20 Human Resources 20 21 Sales Executive valCount = df['Jobrol'].value_counts() valCount Sales Executive 7 Research Scientist 7 Laboratory Technician 5 Manager 1 Human Resources 1 

Conservo las 3 primeras categorías, luego renombro el rest por “OTROS”, ¿cómo debo proceder?

Gracias.

Use value_counts con numpy.where :

 need = df['Jobrol'].value_counts().index[:3] df['Jobrol'] = np.where(df['Jobrol'].isin(need), df['Jobrol'], 'OTHER') valCount = df['Jobrol'].value_counts() print (valCount) Research Scientist 7 Sales Executive 7 Laboratory Technician 5 OTHER 2 Name: Jobrol, dtype: int64 

Otra solución:

 N = 3 s = df['Jobrol'].value_counts() valCount = s.iloc[:N].append(pd.Series(s.iloc[N:].sum(), index=['OTHER'])) print (valCount) Research Scientist 7 Sales Executive 7 Laboratory Technician 5 OTHER 2 dtype: int64 

Convierta su serie en categorías categóricas, extraiga las categorías cuyos recuentos no se encuentran entre los 3 primeros, agregue una nueva categoría, por ejemplo, 'Other' , luego reemplace las categorías calculadas previamente:

 df['Jobrol'] = df['Jobrol'].astype('category') others = df['Jobrol'].value_counts().index[3:] label = 'Other' df['Jobrol'] = df['Jobrol'].cat.add_categories([label]) df['Jobrol'] = df['Jobrol'].replace(others, label) 

Nota: es tentador combinar categorías al cambiarles el nombre a través de df['Jobrol'].cat.rename_categories(dict.fromkeys(others, label)) , pero esto no funcionará ya que esto implicará múltiples categorías etiquetadas idénticamente, lo cual no es ‘ t posible


La solución anterior se puede adaptar para filtrar por conteo . Por ejemplo, para incluir solo categorías con un conteo de 1, puede definir others así:

 counts = df['Jobrol'].value_counts() others = counts[counts == 1].index