Ajout d'une nouvelle colonne à un DataFrame existant en Python pandas

J'ai le DataFrame indexé suivant avec des colonnes nommées et des lignes de nombres non continus :

          a         b         c         d
2  0.671399  0.101208 -0.181532  0.241273
3  0.446172 -0.243316  0.051767  1.577318
5  0.614758  0.075793 -0.451460 -0.012493

Je voudrais ajouter une nouvelle colonne, 'e', au cadre de données existant et ne veux rien changer dans le cadre de données (c'est-à-dire que la nouvelle colonne a toujours la même longueur que le cadre de données).

0   -0.335485
1   -1.166658
2   -0.385571
dtype: float64

J'ai essayé différentes versions de join, append, merge, mais je n'ai pas obtenu le résultat que je voulais, seulement des erreurs tout au plus. Comment puis-je ajouter la colonne e à l'exemple ci-dessus ?

Solution

Utilisez les index df1 originaux pour créer les séries :

df1['e'] = pd.Series(np.random.randn(sLength), index=df1.index)

Edit 2015 Certains ont signalé avoir obtenu le SettingWithCopyWarning avec ce code.
Cependant, le code fonctionne toujours parfaitement avec la version actuelle de pandas 0.16.1.

>>> sLength = len(df1['a'])
>>> df1
          a         b         c         d
6 -0.269221 -0.026476  0.997517  1.294385
8  0.917438  0.847941  0.034235 -0.448948

>>> df1['e'] = pd.Series(np.random.randn(sLength), index=df1.index)
>>> df1
          a         b         c         d         e
6 -0.269221 -0.026476  0.997517  1.294385  1.757167
8  0.917438  0.847941  0.034235 -0.448948  2.228131

>>> p.version.short_version
'0.16.1'

Le SettingWithCopyWarning a pour but d'informer d'une affectation possiblement invalide sur une copie du Dataframe. Il ne dit pas nécessairement que vous l'avez mal fait (il peut déclencher des faux positifs) mais depuis la 0.13.0, il vous fait savoir qu'il existe des méthodes plus adéquates pour le même objectif. Ensuite, si vous recevez l'avertissement, suivez simplement ses conseils : Essayez d'utiliser .loc[row_index,col_indexer] = value à la place.

>>> df1.loc[:,'f'] = pd.Series(np.random.randn(sLength), index=df1.index)
>>> df1
          a         b         c         d         e         f
6 -0.269221 -0.026476  0.997517  1.294385  1.757167 -0.050927
8  0.917438  0.847941  0.034235 -0.448948  2.228131  0.006109
>>> 

En fait, c'est actuellement la méthode la plus efficace, comme [décrit dans la documentation de pandas][1].


Modification 2017

Comme indiqué dans les commentaires et par @Alexander, actuellement la meilleure méthode pour ajouter les valeurs d'une série comme nouvelle colonne d'un DataFrame pourrait être d'utiliser [assign][2] :

df1 = df1.assign(e=pd.Series(np.random.randn(sLength)).values)

[1] : http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy [2] : https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.assign.html

Commentaires (27)

Voici la manière simple d'ajouter une nouvelle colonne : df['e'] = e

Commentaires (4)

Le plus efficace est de le faire directement via [NumPy][1] :

df1['e'] = np.random.randn(sLength)

Notez que ma suggestion originale (très ancienne) était d'utiliser map (qui est beaucoup plus lent) :

df1['e'] = df1['a'].map(lambda x: np.random.random())

[1] : http://en.wikipedia.org/wiki/NumPy

Commentaires (2)