Diviser un dataframe colonne ayant une pandas série en plusieurs colonnes

0

La question

J'ai une pandas dataframe avec de nombreuses colonnes. L'un d'eux est une série. Je veux briser cette colonne dans un jeu booléen colonnes. Donc, si la valeur d'une ligne est ['Rouge','Chaud','Été'], je veux 3 colonnes: Rouge (ayant la valeur 1), Chaud (ayant la valeur 1) et d'Été (ayant la valeur 1).

Exemple:

df = pd.DataFrame({'Owner': ['Bob', 'Jane', 'Amy'],
               'Make': ['Ford', 'Ford', 'Jeep'],
               'Model': ['Bronco', 'Bronco', 'Wrangler'],
               'Sentiment': [['Meh','Red','Dirty'], ['Rusty','Sturdy'], ['Dirty','Red']],
               'Max Speed': [80, 150, 69],
              'Customer Rating': [90, 50, 91]})

nous donne:

enter image description here

Maintenant, je veux cette sortie: enter image description here (Vrai/Faux pourrait être zéros et de uns, trop. Tout aussi bon).

note: j'ai regardé ce post ci-dessous: Diviser une Pandas colonne de listes dans plusieurs colonnes mais que seulement directement des œuvres si la série n'est pas déjà partie d'une DF.

toute aide appréciée!

dataframe pandas python
2021-11-24 02:59:52
2

La meilleure réponse

2

Essayez explode alors crosstab et join

s = df.Sentiment.explode()
out = df.join(pd.crosstab(s.index,s).astype(bool))
out
  Owner  Make     Model          Sentiment  ...    Meh    Red  Rusty  Sturdy
0   Bob  Ford    Bronco  [Meh, Red, Dirty]  ...   True   True  False   False
1  Jane  Ford    Bronco    [Rusty, Sturdy]  ...  False  False   True    True
2   Amy  Jeep  Wrangler       [Dirty, Red]  ...  False   True  False   False
[3 rows x 11 columns]
2021-11-24 14:07:56
0

Essayez ceci:

df = pd.concat([df, pd.get_dummies(df['Sentiment'].explode())], axis=1)

Sortie:

>>> df
  Owner  Make     Model             Sentiment  Max Speed  Customer Rating  AWESOME  Dirty  LOVE  Meh  Red  Rusty  Sturdy
0   Bob  Ford    Bronco     [Meh, Red, Dirty]         80               90        0      0     0    1    0      0       0
0   Bob  Ford    Bronco     [Meh, Red, Dirty]         80               90        0      0     0    0    1      0       0
0   Bob  Ford    Bronco     [Meh, Red, Dirty]         80               90        0      1     0    0    0      0       0
1  Jane  Ford    Bronco       [Rusty, Sturdy]        150               50        0      0     0    0    0      1       0
1  Jane  Ford    Bronco       [Rusty, Sturdy]        150               50        0      0     0    0    0      0       1
2   Amy  Jeep  Wrangler  [LOVE, AWESOME, Red]         69               91        0      0     1    0    0      0       0
2   Amy  Jeep  Wrangler  [LOVE, AWESOME, Red]         69               91        1      0     0    0    0      0       0
2   Amy  Jeep  Wrangler  [LOVE, AWESOME, Red]         69               91        0      0     0    0    1      0       0

Comment ça marche

Ce que vous cherchez est généralement appelé "one-hot" de l'encodage, et il y a une méthode dans les pandas juste pour ça: get_dummies(). Il prend une Série (ou un DataFrame) et crée une nouvelle colonne pour chaque valeur unique dans la Série (ou DataFrame).

df['Sentiment'].explode() crée une nouvelle colonne contenant toutes les valeurs individuelles de toutes les listes dans la colonne sélectionnée(s).

2021-11-24 03:25:47

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................