J'ai un dataframe avec quelques colonnes comme ceci:
A B C
0
4
5
6
7
7
6
5
La plage de valeurs possible dans A est uniquement 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 seule fois sans boucler sur toute la trame 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 dataframe est énorme et l'itération est la dernière option. Mais je peux aussi organiser les éléments dans 'List' dans n'importe quelle autre structure de données comme dict si nécessaire.
Réponses:
IIUC, si vous transformez votre (malheureusement nommé)
List
en unndarray
, vous pouvez simplement l'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 utilisezm = np.asarray(List)
, la même chose devrait fonctionner: les valeurs dansdf.A
sélectionneront les éléments appropriés dem
.Notez que si vous utilisez une ancienne version de
numpy
, vous devrez peut-être utiliser à lam[df.A.values]
place - dans le passé,numpy
ne jouait pas bien avec les autres, et certaines refactorisations ontpandas
causé des maux de tête. Les choses se sont améliorées maintenant.la source
Traceback (most recent call last):
File "./b.py", line 24, in <module>
d["D"] = m[d.A]
IndexError: unsupported iterator index
numpy
bug. Çad["D"] = m[d.A.values]
marche pour toi?Attribuez simplement la liste directement:
df['new_col'] = mylist
Alternative
Convertissez la liste en série ou en tableau, puis attribuez:
se = pd.Series(mylist) df['new_col'] = se.values
ou
df['new_col'] = np.array(mylist)
la source
pykernel_launcher.py:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy """Entry point for launching an IPython kernel.
pd.Series
effet dtype? Je veux dire, laissera-t-il des flotteurs en tant que flotteurs et des chaînes en tant que chaînes? Ou les éléments de la liste seront-ils par défaut des chaînes?Une solution améliorant la grande de @sparrow.
Soit df , votre jeu de données et mylist la liste avec les valeurs que vous souhaitez ajouter au dataframe.
Supposons que vous souhaitiez appeler simplement votre nouvelle colonne, new_column
Commencez par transformer la liste en une série:
Utilisez ensuite la fonction d' insertion pour ajouter la colonne. Cette fonction a l'avantage de vous permettre de choisir dans quelle position vous souhaitez placer la colonne. Dans l'exemple suivant, nous positionnerons la nouvelle colonne dans la première position à partir de la gauche (en définissant loc = 0)
df.insert(loc=0, column='new_column', value=column_values)
la source
Commençons par créer le dataframe que vous aviez, j'ignorerai 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
Production:
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
la source
D
partir des éléments deA
etList
("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 ".")np.array(List)[df.A]
etdf["A"].map(dict(enumerate(List)))
est surtout une question de préférence.Ancienne question; mais j'essaye toujours d'utiliser le code le plus rapide!
J'avais une liste énorme avec 69 millions de uint64. np.array () a été le plus rapide pour moi.
df['hashes'] = hashes Time spent: 17.034842014312744 df['hashes'] = pd.Series(hashes).values Time spent: 17.141014337539673 df['key'] = np.array(hashes) Time spent: 10.724546194076538
la source