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]
3 Réponses :
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
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)
Acceptée car c'était la réponse la plus complète à ce jour. Je vous remercie.
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>