Soy nuevo en los pandas y estoy tratando de descubrir cómo agregar varias columnas a los pandas simultáneamente. Cualquier ayuda aquí será apreciada. Idealmente, me gustaría hacer esto en un paso en lugar de varios pasos repetidos ...
import pandas as pd
df = {'col_1': [0, 1, 2, 3],
'col_2': [4, 5, 6, 7]}
df = pd.DataFrame(df)
df[[ 'column_new_1', 'column_new_2','column_new_3']] = [np.nan, 'dogs',3] #thought this would work here...
KeyError: "None of [Index(['column_new_1', 'column_new_2', 'column_new_3'], dtype='object')] are in the [columns]"
Respuestas:
Hubiera esperado que tu sintaxis también funcionara. El problema surge porque cuando crea nuevas columnas con la sintaxis de lista de columnas (
df[[new1, new2]] = ...
), pandas requiere que el lado derecho sea un DataFrame (tenga en cuenta que en realidad no importa si las columnas del DataFrame tienen los mismos nombres que las columnas estás creando).Su sintaxis funciona bien para asignar valores escalares a columnas existentes , y los pandas también están felices de asignar valores escalares a una nueva columna usando la sintaxis de una sola columna (
df[new1] = ...
). Entonces, la solución es convertir esto en varias asignaciones de una sola columna o crear un DataFrame adecuado para el lado derecho.Aquí hay varios enfoques que se trabajarán:
Entonces uno de los siguientes:
1) Tres asignaciones en una, utilizando el desempaquetado de listas:
2)
DataFrame
expande convenientemente una sola fila para que coincida con el índice, por lo que puede hacer esto:3) Cree un marco de datos temporal con nuevas columnas, luego combínelo con el marco de datos original más tarde:
4) Similar al anterior, pero usando en
join
lugar deconcat
(puede ser menos eficiente):5) Usar un dictado es una forma más "natural" de crear el nuevo marco de datos que los dos anteriores, pero las nuevas columnas se ordenarán alfabéticamente (al menos antes de Python 3.6 o 3.7 ):
6) Úselo
.assign()
con argumentos de varias columnas.Me gusta mucho esta variante en la respuesta de @ zero, pero al igual que la anterior, las nuevas columnas siempre se ordenarán alfabéticamente, al menos con las primeras versiones de Python:
7) Esto es interesante (basado en https://stackoverflow.com/a/44951376/3830997 ), pero no sé cuándo valdría la pena:
8) Al final, es difícil superar tres asignaciones distintas:
Nota: muchas de estas opciones ya se han cubierto en otras respuestas: agregue varias columnas a DataFrame y configúrelas igual a una columna existente . ¿Es posible agregar varias columnas a la vez a un DataFrame de pandas? , Agregue múltiples columnas vacías a pandas DataFrame
fuente
.reindex
alteraría el enfoque # 7 ( ) el índice del marco de datos? ¿Por qué alguien querría alterar innecesariamente el índice al agregar columnas a menos que sea un objetivo explícito ....reindex()
se usa con elcolumns
argumento, por lo que solo cambia la columna "índice" (nombres). No altera el índice de la fila.OrderedDict
: por ejemplo,df.join(pd.DataFrame( OrderedDict([('column_new_2', 'dogs'),('column_new_1', np.nan),('column_new_3', 3)]), index=df.index ))
df = pd.DataFrame({'before': [1, 2, 3], 'after': [4, 5, 6]})
vs.df = pd.DataFrame(OrderedDict([('before', [1, 2, 3]), ('after', [4, 5, 6])])
join
, asegúrese de no tener duplicados en su índice (o use unoreset_index
primero). Podría ahorrarle algunas horas de depuración.Puede usar
assign
con un dict de nombres y valores de columna.fuente
df.assign(**{'col_new_1': np.nan}).assign(**{'col2_new_2': 'dogs'}).assign(**{'col3_new_3': 3})
Con el uso de concat :
No estoy muy seguro de lo que querías hacer
[np.nan, 'dogs',3]
. ¿Quizás ahora establecerlos como valores predeterminados?fuente
uso de la comprensión de listas,
pd.DataFrame
ypd.concat
fuente
si agrego muchas columnas faltantes (a, b, c, ....) con el mismo valor, aquí 0, hice esto:
Se basa en la segunda variante de la respuesta aceptada.
fuente
Solo quiero señalar esa opción2 en la respuesta de @Matthias Fripp
ya está documentado en la propia documentación de los pandas http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics
fuente
pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)
replica la fila que se le da para crear un marco de datos completo de la misma longitud que el índice.Si solo desea agregar nuevas columnas vacías, reindex hará el trabajo
ejemplo de código completo
de lo contrario, vaya a ceros, responda con asignar
fuente
No me siento cómodo usando "Index" y así sucesivamente ... podría aparecer como se muestra a continuación
fuente