6 votes

Pandas - combine les valeurs des colonnes en une liste dans une nouvelle colonne

J'ai un cadre de données Python Pandas df :

d=[['hello',1,'GOOD','long.kw'],
   [1.2,'chipotle',np.nan,'bingo'],
   ['various',np.nan,3000,123.456]]                                                    
t=pd.DataFrame(data=d, columns=['A','B','C','D']) 

qui ressemble à ceci :

print(t)
         A         B     C        D
0    hello         1  GOOD  long.kw
1      1.2  chipotle   NaN    bingo
2  various       NaN  3000  123.456

J'essaye de créer une nouvelle colonne qui est une list des valeurs dans A , B , C y D . Cela ressemblerait donc à ceci :

t['combined']                                             

Out[125]: 
0        [hello, 1, GOOD, long.kw]
1        [1.2, chipotle, nan, bingo]
2        [various, nan, 3000, 123.456]
Name: combined, dtype: object

J'essaie ce code :

t['combined'] = t.apply(lambda x: list([x['A'],
                                        x['B'],
                                        x['C'],
                                        x['D']]),axis=1)    

Ce qui renvoie cette erreur :

ValueError: Wrong number of items passed 4, placement implies 1 

Ce qui m'intrigue, c'est que si je supprime l'une des colonnes que je veux mettre dans la liste (ou si j'ajoute une autre colonne au cadre de données que je n'ajoute PAS à la liste), mon code fonctionne.

Par exemple, exécutez ce code :

t['combined'] = t.apply(lambda x: list([x['A'],
                                        x['B'],
                                        x['D']]),axis=1)      

Renvoie ceci, ce qui est parfait si je ne voulais que les 3 colonnes :

print(t)
         A         B     C        D                 combined
0    hello         1  GOOD  long.kw      [hello, 1, long.kw]
1      1.2  chipotle   NaN    bingo   [1.2, chipotle, bingo]
2  various       NaN  3000  123.456  [various, nan, 123.456]

Je ne comprends pas pourquoi le fait de demander que la liste "combinée" soit constituée de toutes les colonnes du cadre de données crée une erreur, alors qu'en sélectionnant toutes les colonnes sauf une pour créer la liste "combinée", la liste est créée comme prévu.

11voto

Steven G Points 5522

Essayez ceci :

t['combined']= t.values.tolist()

t
Out[50]: 
         A         B     C        D                       combined
0    hello         1  GOOD  long.kw      [hello, 1, GOOD, long.kw]
1     1.20  chipotle   NaN    bingo    [1.2, chipotle, nan, bingo]
2  various       NaN  3000   123.46  [various, nan, 3000, 123.456]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X