¿Cómo agregar una columna vacía a un marco de datos?

262

¿Cuál es la forma más fácil de agregar una columna vacía a un DataFrameobjeto pandas ? Lo mejor que he encontrado es algo como

df['foo'] = df.apply(lambda _: '', axis=1)

¿Hay un método menos perverso?

kjo
fuente
2
¿Realmente quieres una columna que contenga cadenas vacías o más bien N/A?
filmor

Respuestas:

420

Si entiendo correctamente, la tarea debe llenar:

>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
>>> df
   A  B
0  1  2
1  2  3
2  3  4
>>> df["C"] = ""
>>> df["D"] = np.nan
>>> df
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN
DSM
fuente
2
Esta respuesta acaba de crear nuevas filas para mí.
logicbloke
@logicbloke, ¿puede proporcionar un ejemplo de lo que está sucediendo?
craymichael
@craymichael Ha pasado un tiempo, pero creo que tenía columnas indexadas por números sin nombres y filas con nombre, y simplemente creó una nueva fila al final.
logicbloke
1
Si el dfusuario está vacía, es posible que desee utilizar df['new'] = pd.Series() (véase mi respuesta a continuación)
Carsten
¿Cómo agregar múltiples columnas vacías?
M. Mariscal
46

Para agregar a la respuesta de DSM y construir sobre esta pregunta asociada , dividiría el enfoque en dos casos:

  • Agregar una sola columna: simplemente asigne valores vacíos a las nuevas columnas, por ejemplo df['C'] = np.nan

  • Agregar varias columnas: sugeriría usar el .reindex(columns=[...]) método de pandas para agregar las nuevas columnas al índice de columnas del marco de datos. Esto también funciona para agregar varias filas nuevas con .reindex(rows=[...]). Tenga en cuenta que las versiones más recientes de Pandas (v> 0.20) le permiten especificar una axispalabra clave en lugar de asignarla explícitamente a columnso rows.

Aquí hay un ejemplo que agrega varias columnas:

mydf = mydf.reindex(columns = mydf.columns.tolist() + ['newcol1','newcol2'])

o

mydf = mydf.reindex(mydf.columns.tolist() + ['newcol1','newcol2'], axis=1)  # version > 0.20.0

También siempre puede concatenar un nuevo marco de datos (vacío) al marco de datos existente, pero eso no me parece tan pitónico :)

emunsing
fuente
3
Ejemplo para version >= 0.20.0eliminar el DataFrame y agrega las nuevas columnas como filas. Ejemplo para version < 0.20.0trabajos bien en la versión de Pandas0.24.1
Lalo
@emunsing Mientras buscaba una respuesta a esta pregunta, finalmente encontré su respuesta útil. En un primer momento, sin embargo, no estaba trabajando para mí como pandas requiere , axis=1en version = 0.25. Intenté modificar su respuesta para incluir la versión actualizada, pero @kenlukas y @il_raffa me rechazaron. Espero que todos los que luchan por entender por qué su respuesta no les está funcionando, como a mí, al menos se encuentran con este comentario.
Griff
@Griff: ahora he actualizado mi respuesta para que sea más precisa y explícita sobre los problemas de compatibilidad de versiones. Gracias por resaltar esto.
Emunsing
35

Una solución aún más simple es:

df = df.reindex(columns = header_list)                

donde "header_list" es una lista de los encabezados que desea que aparezcan.

cualquier encabezado incluido en la lista que no se encuentre ya en el marco de datos se agregará con celdas en blanco a continuación.

Así que si

header_list = ['a','b','c', 'd']

entonces cyd se agregarán como columnas con celdas en blanco

liana
fuente
2
Más precisamente, las columnas se agregarán con NaNs.
broccoli2000
19

Comenzando con v0.16.0, DF.assign()podría usarse para asignar nuevas columnas ( simples / múltiples ) a DF. Estas columnas se insertan en orden alfabético al final de DF.

Esto se vuelve ventajoso en comparación con la asignación simple en los casos en que desea realizar una serie de operaciones encadenadas directamente en el marco de datos devuelto.

Considere la misma DFmuestra demostrada por @DSM:

df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
df
Out[18]:
   A  B
0  1  2
1  2  3
2  3  4

df.assign(C="",D=np.nan)
Out[21]:
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN

Tenga en cuenta que esto devuelve una copia con todas las columnas anteriores junto con las recién creadas. Para que el original DFse modifique en consecuencia, úselo como: df = df.assign(...)ya que actualmente no admite la inplaceoperación.

Nickil Maveli
fuente
¿Cuál es ese tipo de datos para C? Estoy tratando de agregar recorriendo una lista de cadenas. Pero no lo usa.
eleijonmarck
12

Me gusta:

df['new'] = pd.Series(dtype='your_required_dtype')

Si tiene un marco de datos vacío, esta solución se asegura de que no NaNse agregue una nueva fila que solo contenga .

Si dtypeno se especifica, las nuevas versiones de Pandas producen a DeprecationWarning.

Carsten
fuente
5

si desea agregar el nombre de columna de una lista

df=pd.DataFrame()
a=['col1','col2','col3','col4']
for i in a:
    df[i]=np.nan
Joy Mazumder
fuente
4

La respuesta de @emunsing es realmente genial para agregar varias columnas, pero no pude hacer que funcione para mí en Python 2.7. En cambio, encontré que esto funciona:

mydf = mydf.reindex(columns = np.append( mydf.columns.values, ['newcol1','newcol2'])
caso extremo
fuente
1

El siguiente código aborda la pregunta "¿Cómo agrego un número n de columnas vacías a mi marco de datos existente?". En el interés de mantener soluciones a problemas similares en un lugar, lo estoy agregando aquí.

Enfoque 1 (para crear 64 columnas adicionales con nombres de columnas del 1 al 64)

m = list(range(1,65,1)) 
dd=pd.DataFrame(columns=m)
df.join(dd).replace(np.nan,'') #df is the dataframe that already exists

Enfoque 2 (para crear 64 columnas adicionales con nombres de columnas del 1 al 64)

df.reindex(df.columns.tolist() + list(range(1,65,1)), axis=1).replace(np.nan,'')
moys
fuente
1

Tu puedes hacer

df['column'] = None #This works. This will create a new column with None type
df.column = None #This will work only when the column is already present in the dataframe 
Bharat_Raja
fuente
1

Se puede usar df.insert(index_to_insert_at, column_header, init_value)para insertar una nueva columna en un índice específico.

cost_tbl.insert(1, "col_name", "") 

La declaración anterior insertaría una columna vacía después de la primera columna.

Usman Ahmad
fuente