J'ai donc un dataframe comme:
et je veux une sortie comme:
Les lignes de df1 ne sont rien d'autre que des combinaisons des noms de colonne, partout où le nom de combinaison correspond aux noms de colonne, cette cellule sera définie comme 1 et restera 0
Une idée comment y parvenir?
J'ai essayé de parcourir chaque ligne et de faire une chaîne contenant une condition mais un peu bloquée.
3 Réponses :
Cela semble un peu piraté mais devrait faire l'affaire:
import numpy as np
import pandas as pd
df = pd.DataFrame(np.zeros((2, 4)), columns=["a", "b", "c", "d"], index=["a", ["a", "b"]])
pd.DataFrame(df.index.map(lambda l: pd.get_dummies(l, columns=df.columns).agg("sum")).tolist(), index=df.index).fillna(0)
# a b
# a 1.0 0.0
# [a, b] 1.0 1.0
J'ai pu le faire en utilisant le code ci-dessous
df.reset_index(inplace=True)
for i in range(1,len(df.columns)):
df.iloc[:, i]= df['index'].apply(lambda x: 1 if df.columns[i] in(x) else 0)
df
Voici un moyen simple (un liner) de le faire en utilisant explode , get_dummies et groupby
0 a b c d 0 a 1 0 0 0 1 [a, b] 1 1 0 0 2 [a, b, c] 1 1 1 0 3 [b, c, d] 0 1 1 1 4 [b, d] 0 1 0 1
import pandas as pd df = pd.DataFrame(['a',['a','b'],['a','b','c'], ['b','c','d'], ['b', 'd']]) multihot = pd.get_dummies(df.iloc[:,0].explode()).groupby(level=0).sum() result = df.join(multihot) print(result)
Assurez-vous simplement que la première colonne de votre entrée df est la colonne qui contient les listes.
consultez
str.get_dummies(sep=',')pandas.pydata.org/pandas-docs/stable/reference/api/...