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.
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.
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)
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)
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