python pandas append une colonne dans dataframe de la liste

[EDIT: Sujet / titre incorrect du message corrigé]

J’ai un dataframe avec des colonnes comme ceci:

ABC 0 4 5 6 7 7 6 5 

La plage possible de valeurs dans A est seulement de 0 à 7 .

J’ai aussi une liste de 8 éléments comme ceci:

 List=[2,5,6,8,12,16,26,32] //There are only 8 elements in this list 

Si l’élément de la colonne A est n , je dois insérer le nième élément de la liste dans une nouvelle colonne, par exemple «D».

Comment puis-je le faire en une seule fois sans avoir à parcourir l’ensemble du dataframe?

Le dataframe résultant ressemblerait à ceci:

 ABCD 0 2 4 12 5 16 6 26 7 32 7 32 6 26 5 16 

(Remarque: le dataframe est énorme et l’itération est la dernière option. Mais je peux aussi organiser les éléments de ‘List’ dans toute autre structure de données comme dict si nécessaire)

Si vous faites votre liste (malheureusement nommée) dans un ndarray , vous pouvez simplement y indexer naturellement.

 >>> m = np.arange(16)*10 >>> m[df.A] array([ 0, 40, 50, 60, 150, 150, 140, 130]) >>> df["D"] = m[df.A] >>> df ABCD 0 0 NaN NaN 0 1 4 NaN NaN 40 2 5 NaN NaN 50 3 6 NaN NaN 60 4 15 NaN NaN 150 5 15 NaN NaN 150 6 14 NaN NaN 140 7 13 NaN NaN 130 

Ici, j’ai construit un nouveau m , mais si vous utilisez m = np.asarray(List) , la même chose devrait fonctionner: les valeurs de df.A les éléments appropriés de m .


Notez que si vous utilisez une ancienne version de numpy , vous devrez peut-être utiliser m[df.A.values] place – dans le passé, numpy ne numpy pas bien avec les autres, et certains remaniements dans les pandas causé des maux de tête . Les choses se sont améliorées maintenant.

Faites d’abord la liste dans une série:

 se = pd.Series(mylist) 

Ajoutez ensuite les valeurs au DataFrame:

 df['new_col'] = se.values 

Commençons par créer le dataframe que vous avez, je vais ignorer les colonnes B et C car elles ne sont pas pertinentes.

 df = pd.DataFrame({'A': [0, 4, 5, 6, 7, 7, 6,5]}) 

Et la cartographie que vous désirez:

 mapping = dict(enumerate([2,5,6,8,12,16,26,32])) df['D'] = df['A'].map(mapping) 

Terminé!

 print df 

Sortie:

  AD 0 0 2 1 4 12 2 5 16 3 6 26 4 7 32 5 7 32 6 6 26 7 5 16