3
votes

Convertir (transposer) des listes de dataframe en colonnes

J'ai un dataframe pandas qui contient une liste de valeurs dans une cellule. J'ai besoin de convertir ces valeurs en colonnes contenant vrai ou faux si la valeur de la colonne se trouve dans la liste de cette ligne. J'ai besoin d'une colonne pour chaque valeur unique dans la liste de chaque ligne.

Voici mon dataframe:

agency_id CH PE CS
1 true true false
3 true false true

Pour créer le dataframe initial.

Ensuite J'ai essayé:

 0     1     2     3     4     5     6     7
agency_id                                                
1            CH    PE    AQ    TE  None  None  None  None
3            KR    CS  None  None  None  None  None  None
7            FE    FC    BO    MO    RA    RE    RN    PR
8          None  None  None  None  None  None  None  None
10           RM  None  None  None  None  None  None  None
11           RM  None  None  None  None  None  None  None

et il affiche ceci:

df2 = pd.DataFrame(df['province'].values.tolist(),index=df['agency_id'])

Mais ce n'est pas ce que je veux parce que les colonnes ne le sont pas " aligné ".

J'ai besoin de quelque chose comme ceci:

data = [
{"agency_id": 1,"province": ["CH", "PE"]},
{"agency_id": 3,"province": ["CH", "CS"]}
]
df = pd.DataFrame(data)

   agency_id                          province
0          1                  [CH, PE]
1          3                          [CH, CS]


0 commentaires

3 Réponses :


3
votes

Depuis sklearn MultiLabelBinarizer

from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
pd.DataFrame(mlb.fit_transform(df['province']),columns=mlb.classes_, index=df.agency_id).astype(bool)
Out[90]: 
             CH     CS     PE
agency_id                    
1          True  False   True
3          True   True  False


0 commentaires

2
votes

Vous pouvez nettoyer / modifier vos données si vous n'aimez pas importer depuis sklearn.preprocessing import MultiLabelBinarizer pour cela:

# data
[{'agency_id': 1, 'province': ['CH', 'PE'], 'CH': True, 'CS': False, 'PE': True}, 
 {'agency_id': 3, 'province': ['CH', 'CS'], 'CH': True, 'CS': True, 'PE': False}]

# df 
     CH     CS     PE  agency_id  province
0  True  False   True          1  [CH, PE]
1  True   True  False          3  [CH, CS] 

Sortie:

import pandas as pd

data = [
{"agency_id": 1,"province": ["CH", "PE"]},
{"agency_id": 3,"province": ["CH", "CS"]}
]

# get all provinces from any included dictionaries of data:
all_prov = sorted(set( (x for y in [d["province"] for d in data] for x in y) ))

# add the missing key:values to your data's dicts:
for d in data:
    for p in all_prov:
        d[p] = p in d["province"]

print(data)

df = pd.DataFrame(data)
print(df)


1 commentaires

Acceptée car c'était la réponse la plus complète à ce jour. Je vous remercie.



1
votes

Une autre solution, en utilisant simplement pandas :

             CH     CS     PE
agency_id                    
1          True  False   True
3          True   True  False

import pandas as pd

data = [
{"agency_id": 1,"province": ["CH", "PE"]},
{"agency_id": 3,"province": ["CH", "CS"]}
]
df = pd.DataFrame(data)

result = df['province'].apply(lambda x: '|'.join(x)).str.get_dummies().astype(bool).set_index(df.agency_id)
print(result)
p>


0 commentaires