Comment coder en binaire une variable catégorielle à valeurs multiples à partir d'une trame de données Pandas?

9

Supposons que nous ayons la trame de données suivante avec plusieurs valeurs pour une certaine colonne:

    categories
0 - ["A", "B"]
1 - ["B", "C", "D"]
2 - ["B", "D"]

Comment obtenir une table comme celle-ci?

   "A"  "B"  "C"  "D"
0 - 1    1    0    0
1 - 0    1    1    1
2 - 0    1    0    1

Remarque: Je n'ai pas nécessairement besoin d'un nouveau dataframe, je me demande comment transformer ces DataFrames dans un format plus adapté à l'apprentissage automatique.

Denis L
la source

Réponses:

7

Si [0, 1, 2]sont des étiquettes numériques et n'est pas l'index, alors pandas.DataFrame.pivot_tablefonctionne:

Dans []:
data = pd.DataFrame.from_records (
    [[0, 'A'], [0, 'B'], [1, 'B'], [1, 'C'], [1, 'D'], [2, 'B'], [ 2, «D»]],
    colonnes = ['numéro_étiquette', 'catégorie'])
data.pivot_table (index = ['number_label'], colonnes = ['category'], aggfunc = [len], fill_value = 0)
En dehors[]:
              len
catégorie ABCD
numéro_étiquette                       
0 1 1 0 0
1 0 1 1 1
2 0 1 0 1

Cet article de blog était utile: http://pbpython.com/pandas-pivot-table-explained.html


Si [0, 1, 2]est l'indice, alors collections.Counterest utile:

Dans []:
data2 = pd.DataFrame.from_dict (
    {'categories': {0: ['A', 'B'], 1: ['B', 'C', 'D'], 2: ['B', 'D']}}))
data3 = data2 ['categories']. apply (collections.Counter)
pd.DataFrame.from_records (data3) .fillna (valeur = 0)
En dehors[]:
       A B C D
0 1 1 0 0
1 0 1 1 1
2 0 1 0 1
Samuel Harrold
la source
Merci, je vais vérifier. En fait, le 0, 1 et 2 sont l'indice. De plus, avez-vous une idée de la façon dont la parcimonie peut être gérée efficacement ici car il y a beaucoup de zéros?
Denis L
Les pandas et scipy ont des structures de données clairsemées ( pandas sparse , scipy sparse ) pour économiser de la mémoire, mais elles peuvent ne pas être prises en charge par la bibliothèque d'apprentissage automatique que vous utilisez. Si la dimensionnalité de votre problème (nombre de colonnes) est si grande qu'une représentation clairsemée est nécessaire, vous pouvez envisager d'utiliser également des techniques de réduction de dimensionnalité .
Samuel Harrold