2
votes

Pandas vérifie les valeurs de la liste de lignes avec le nom de la colonne

J'ai donc un dataframe comme:

entrez la description de l'image ici

et je veux une sortie comme:

entrez la description de l'image ici

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.


1 commentaires

consultez str.get_dummies(sep=',') pandas.pydata.org/pandas-docs/stable/reference/api/...


3 Réponses :


0
votes

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


0 commentaires

0
votes

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


0 commentaires

1
votes

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.


0 commentaires