Salut à tous, j'ai un fichier csv qui contient des données au format ci-dessous

A   a
A   b
B   f
B   g
B   e
B   h
C   d
C   e
C   f

La première colonne contient des éléments, la deuxième colonne contient les fonctionnalités disponibles du vecteur de caractéristiques = [a, b, c, d, e, f, g, h] Je veux convertir cela en matrice d'occurrence comme ci-dessous

    a,b,c,d,e,f,g,h
A   1,1,0,0,0,0,0,0
B   0,0,0,0,1,1,1,1
C   0,0,0,1,1,1,0,0

Quelqu'un peut-il me dire comment faire cela en utilisant des pandas?

6
Isura Nirmal 20 juil. 2015 à 17:19

2 réponses

Meilleure réponse

Voici une autre façon de le faire en utilisant pd.get_dummies().

import pandas as pd

# your data
# =======================
df

  col1 col2
0    A    a
1    A    b
2    B    f
3    B    g
4    B    e
5    B    h
6    C    d
7    C    e
8    C    f

# processing
# ===================================
pd.get_dummies(df.col2).groupby(df.col1).apply(max)

      a  b  d  e  f  g  h
col1                     
A     1  1  0  0  0  0  0
B     0  0  0  1  1  1  1
C     0  0  1  1  1  0  0
10
Jianxun Li 20 juil. 2015 à 14:27

Vous ne savez pas si vos données comportent une faute de frappe ou non, mais vous pouvez crosstab pour cela:

In [95]:
pd.crosstab(index=df['A'], columns = df['a'])

Out[95]:
a  b  d  e  f  g  h
A                  
A  1  0  0  0  0  0
B  0  0  1  1  1  1
C  0  1  1  1  0  0

Dans votre exemple de données, votre deuxième colonne a la valeur a comme nom de cette colonne, mais dans votre sortie attendue, elle est dans la colonne en tant que valeur

MODIFIER

OK j'ai corrigé vos données d'entrée afin qu'elles génèrent le résultat correct:

In [98]:
import pandas as pd
import io
t="""A   a
A   b
B   f
B   g
B   e
B   h
C   d
C   e
C   f"""
df = pd.read_csv(io.StringIO(t), sep='\s+', header=None, names=['A','a'])
df

Out[98]:
   A  a
0  A  a
1  A  b
2  B  f
3  B  g
4  B  e
5  B  h
6  C  d
7  C  e
8  C  f

In [99]:
ct = pd.crosstab(index=df['A'], columns = df['a'])
ct

Out[99]:
a  a  b  d  e  f  g  h
A                     
A  1  1  0  0  0  0  0
B  0  0  0  1  1  1  1
C  0  0  1  1  1  0  0
6
EdChum 20 juil. 2015 à 14:24