web-dev-qa-db-fra.com

Ajouter une colonne dans la base de données depuis la liste

J'ai un dataframe avec quelques colonnes comme ceci:

A   B   C  
0   
4
5
6
7
7
6
5

Les plage de valeurs possibles dans A ne vont que de 0 à 7.

De plus, j'ai une liste de 8 éléments comme celui-ci:

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 n ème élément de la liste dans une nouvelle colonne, dites "D".

Comment puis-je faire cela en une fois sans passer en boucle sur l'ensemble du cadre de données?

Le dataframe résultant ressemblerait à ceci:

A   B   C   D
0           2
4           12
5           16
6           26
7           32
7           32
6           26
5           16

Remarque: le cadre de données est énorme et la dernière option est l'itération. Mais je peux aussi organiser les éléments de la liste dans n'importe quelle autre structure de données, comme dict, si nécessaire.

65
mane

IIUC, si vous faites votre (malheureusement nommé) List dans un ndarray, vous pouvez simplement y indexer naturellement.

>>> import numpy as np
>>> m = np.arange(16)*10
>>> m[df.A]
array([  0,  40,  50,  60, 150, 150, 140, 130])
>>> df["D"] = m[df.A]
>>> df
    A   B   C    D
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 dans df.A choisiront 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] à la place-- dans le passé, numpy ne jouait pas bien avec d'autres, et certains refactoring dans pandas a provoqué des maux de tête. Les choses se sont améliorées maintenant.

35
DSM

Attribuez simplement la liste directement:

df['new_col'] = mylist

Alternative
Convertissez la liste en une série ou un tableau, puis affectez:

se = pd.Series(mylist)
df['new_col'] = se.values

ou

df['new_col'] = np.array(mylist)
197
sparrow

Une solution améliorant l'excellente solution de @sparrow.

Soit df, soit votre jeu de données, et mylist la liste avec les valeurs que vous souhaitez ajouter à la structure de données.

Supposons que vous souhaitiez appeler votre nouvelle colonne simplement, new_column

Commencez par faire la liste en une série:

column_values = pd.Series(mylist)

Puis utilisez la fonction insert pour ajouter la colonne. Cette fonction a l’avantage de vous permettre de choisir la position dans laquelle vous voulez placer la colonne. Dans l'exemple suivant, nous allons positionner la nouvelle colonne dans la première position en partant de la gauche (en définissant loc = 0)

df.insert(loc=0, column='new_column', value=column_values)
11

Commençons par créer le cadre de données que vous aviez, 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)

Fait!

print df

Sortie:

   A   D
0  0   2
1  4  12
2  5  16
3  6  26
4  7  32
5  7  32
6  6  26
7  5  16
8
Phil Cooper