2017-10-08 1 views
1

J'ai une liste de noms de villes que je veux catégoriser en fonction de leurs fréquences. J'ai d'abord voulu utiliser le binning, mais comme cela nécessitait un espacement monotone, j'ai renoncé à cela. Une prochaine approche, peut-être même meilleure, consisterait à créer des catégories basées sur des quantiles basés sur les fréquences utilisant pandas.qcut. Mais ayant les quantiles, je n'ai aucune idée de comment créer une colonne supplémentaire basée sur leur quantile. Exemple:Comment classer une colonne de texte en fonction des fréquences

import numpy as np 
import pandas as pd 

np.random.seed(0) 
cities = np.random.choice(['Ontario', 'Ottawa', 'Vancouver','Edmonton', 
          'Winnipeg', 'Churchill'], 500) 
# Create fake data and their frequencies 
df = pd.DataFrame (cities, columns=['City']) 
freq = df['City'].value_counts() 
print (freq) 
# Create quantiles 
qc = pd.qcut (freq, 3) 
print (qc) 
# And now? I have the quantiles but how to assign a categorie to each City? 
category_for_each_city = df['City'] in qC# does not work, but many other things neither 

J'ai essayé beaucoup de choses mais rien de tout cela n'a fonctionné. Je devrais pouvoir écrire une boucle pour ceci mais je ne peux pas imaginer que c'est la manière de Python. J'ai essayé de trouver des transformateurs Sklearn mais je n'ai pas trouvé de solution spécifique. Toute aide serait grandement appréciée.

En outre, j'ai beaucoup de distributions asymétriques, une solution qui peut être étendue à par exemple une transformation de journal serait d'une grande aide.

Répondre

1

Tu étais presque ...

In [106]: category_for_each_city = df['City'].map(qc) 

In [107]: category_for_each_city 
Out[107]: 
0  (77.333, 84.667] 
1  (72.999, 77.333] 
2  (84.667, 100.0] 
3  (84.667, 100.0] 
4  (84.667, 100.0] 
5  (84.667, 100.0] 
6  (77.333, 84.667] 
      ... 
493  (84.667, 100.0] 
494 (72.999, 77.333] 
495 (77.333, 84.667] 
496  (84.667, 100.0] 
497 (77.333, 84.667] 
498 (77.333, 84.667] 
499 (77.333, 84.667] 
Name: City, Length: 500, dtype: category 
Categories (3, interval[float64]): [(72.999, 77.333] < (77.333, 84.667] < (84.667, 100.0]] 

MISE À JOUR:

In [114]: qc = pd.qcut (freq, 3, labels=[0,1,2]) 

In [115]: category_for_each_city = df['City'].map(qc) 

In [116]: category_for_each_city 
Out[116]: 
0  1 
1  0 
2  2 
3  2 
4  2 
5  2 
6  1 
     .. 
493 2 
494 0 
495 1 
496 2 
497 1 
498 1 
499 1 
Name: City, Length: 500, dtype: category 
Categories (3, int64): [0 < 1 < 2] 
+0

C'est facile en effet. J'essayais quelque chose comme 'qc.category_for_each_city.codes [df ['City']]' mais votre solution est beaucoup plus simple. Merci beaucoup pour votre aide! – Arnold