Agregar columna al marco de datos con valor constante

187

Tengo un marco de datos existente al que necesito agregar una columna adicional que contendrá el mismo valor para cada fila.

Df existente:

Date, Open, High, Low, Close
01-01-2015, 565, 600, 400, 450

Nuevo df:

Name, Date, Open, High, Low, Close
abc, 01-01-2015, 565, 600, 400, 450

Sé cómo agregar una columna de serie / marco de datos existente. Pero esta es una situación diferente, porque todo lo que necesito es agregar la columna 'Nombre' y establecer cada fila en el mismo valor, en este caso 'abc'.

Darkpool
fuente

Respuestas:

295

df['Name']='abc' agregará la nueva columna y establecerá todas las filas a ese valor:

In [79]:

df
Out[79]:
         Date, Open, High,  Low,  Close
0  01-01-2015,  565,  600,  400,    450
In [80]:

df['Name'] = 'abc'
df
Out[80]:
         Date, Open, High,  Low,  Close Name
0  01-01-2015,  565,  600,  400,    450  abc
EdChum
fuente
35
Hay alguna otra manera de hacer esto? Me sigue la advertencia. Se está intentando establecer un valor en una copia de un segmento de un DataFrame. Intente usar .loc [row_indexer, col_indexer] = value en su lugar. Vea las advertencias en la documentación: pandas.pydata.org/pandas-docs/stable/…
vishnu viswanath
3
Eso significa que está asignando algo que es una copia y no el df original, no puedo hacer más comentarios sin ver los datos y su código en forma de pregunta. Responder preguntas en los comentarios es contraproducente. Este código funciona, has hecho algo antes de esto para generar la advertencia
EdChum
@vishnuviswanath Recibo exactamente la misma advertencia que usted cuando uso Jupyter Notebook. Me sucede cuando tengo tamaños de DataFrame no triviales (> 200 registros) y ciertas combinaciones de asignación y simplemente imprimo el df.
Bill
44
@vishnuviswanath probablemente haya creado una porción del marco de datos original antes de esto, y luego intente establecer la nueva columna en esa porción. Agregue la nueva columna al marco de datos original y luego cree el segmento después de eso. Probablemente cuando crea una porción de un marco de datos, los pandas no crean una copia y de alguna manera la maneja desde el marco de datos original. Este tipo de problemas con esa optimización, y de ahí la advertencia.
amit_saxena
2
Para solucionar la advertencia de pandas mencionada, solo obtenga una copia del marco de datos usando .copy(), antes de usar esto (a menos que sea enorme o algo o el rendimiento realmente cuente).
matanster
61

Puede usar insertpara especificar dónde desea que esté la nueva columna. En este caso, uso 0para colocar la nueva columna a la izquierda.

df.insert(0, 'Name', 'abc')

  Name        Date  Open  High  Low  Close
0  abc  01-01-2015   565   600  400    450
piRSquared
fuente
Esto no funciona para mi. Mi matriz original es 1460 x 41 y estoy tratando de agregar una columna de 1 de la parte delantera: df.insert(0,'coef_fix',1). Estoy usando JupyterLab con Python 3.0
ColinMac
2
Funciona bien para mi. Puede que no te hayas dado cuenta de que insertfunciona inplace. Esto significa que el valor del nuevo marco de datos no se devuelve pero el marco de datos original se ha modificado. Prueba estodf = pd.DataFrame(0, range(1460), range(41)); df.insert(0, 'coef_fix', 1); df
piRSquared el
44

El revestimiento simple funciona

df['Name'] = 'abc'

Crea una Namecolumna y establece todas las filas en abcvalor

Cero
fuente
41

Resumiendo lo que los demás han sugerido y agregando una tercera vía

Usted puede:

  • asignar (** kwargs) :

    df.assign(Name='abc')
  • acceder a la nueva serie de columnas (se creará) y configurarla:

    df['Name'] = 'abc'
  • insert (loc, columna, valor, allow_duplicates = False)

    df.insert(0, 'Name', 'abc')

    donde el argumento loc (0 <= loc <= len (columnas)) le permite insertar la columna donde desee.

    'loc' le proporciona el índice en el que estará su columna después de la inserción. Por ejemplo, el código anterior inserta el Nombre de la columna como la columna 0, es decir, se insertará antes de la primera columna, convirtiéndose en la nueva primera columna. (La indexación comienza desde 0).

Todos estos métodos le permiten agregar una nueva columna de una Serie también (simplemente sustituya el argumento predeterminado 'abc' anterior con la serie).

Michele Piccolini
fuente