Añadir una nueva columna a un DataFrame existente en Python pandas

Tengo el siguiente DataFrame indexado con columnas y filas con nombre y números no continuos:

          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

Me gustaría añadir una nueva columna, 'e', al marco de datos existente y no quiero cambiar nada en el marco de datos (es decir, la nueva columna siempre tiene la misma longitud que el DataFrame).

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

He probado diferentes versiones de join, append, merge, pero no he obtenido el resultado que quería, sólo errores como mucho. ¿Cómo puedo añadir la columna e al ejemplo anterior?

Solución

Utilice los índices originales de df1 para crear la serie:

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

Editar 2015 Algunos reportaron obtener el SettingWithCopyWarning con este código.
Sin embargo, el código sigue funcionando perfectamente con la versión actual 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'

El SettingWithCopyWarning pretende informar de una posible asignación no válida en una copia del Dataframe. No dice necesariamente que lo hayas hecho mal (puede desencadenar falsos positivos) pero desde 0.13.0 te hace saber que hay métodos más adecuados para el mismo propósito. Entonces, si recibes la advertencia, sigue su consejo: Intenta usar .loc[row_index,col_indexer] = value en su lugar.

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

De hecho, este es actualmente el método más eficiente como descrito en los docs de pandas


Editar 2017

Como se indica en los comentarios y por @Alexander, actualmente el mejor método para añadir los valores de una Serie como una nueva columna de un DataFrame podría ser utilizando assign:

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

Esta es la forma sencilla de añadir una nueva columna: df['e'] = e

Comentarios (4)

Hacerlo directamente a través de NumPy será lo más eficiente:

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

Tenga en cuenta que mi sugerencia original (muy antigua) era utilizar map (que es mucho más lento):

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