¿Es posible agregar varias columnas a la vez a un dataframe de pandas?

Si quiero crear un nuevo DataFrame con varias columnas, puedo agregar todas las columnas a la vez, por ejemplo, de la siguiente manera:

data = {'col_1': [0, 1, 2, 3], 'col_2': [4, 5, 6, 7]} df = pd.DataFrame(data) 

Pero ahora, supongamos que más adelante quiero agregar un conjunto de columnas adicionales a este DataFrame. ¿Hay alguna manera de agregarlos todos simultáneamente, como en

 additional_data = {'col_3': [8, 9, 10, 11], 'col_4': [12, 13, 14, 15]} #Below is a made-up function of the kind I desire. df.add_data(additional_data) 

Soy consciente de que podría hacer esto:

 for key, value in additional_data.iteritems(): df[key] = value 

O esto:

 df2 = pd.DataFrame(additional_data, index=df.index) df = pd.merge(df, df2, on=df.index) 

Solo estaba esperando algo más limpio. Si estoy atascado con estas dos opciones, ¿cuál es la preferida?

Las pandas tienen un método de assign desde 0.16.0 . Podrías usarlo en marcos de datos como

 In [1506]: df1.assign(**df2) Out[1506]: col_1 col_2 col_3 col_4 0 0 4 8 12 1 1 5 9 13 2 2 6 10 14 3 3 7 11 15 

O, puedes usar directamente el diccionario como

 In [1507]: df1.assign(**additional_data) Out[1507]: col_1 col_2 col_3 col_4 0 0 4 8 12 1 1 5 9 13 2 2 6 10 14 3 3 7 11 15 

Lo que necesitas es la función de join :

 df1.join(df2, how='outer') #or df1.join(df2) # this works also 

Ejemplo:

 data = {'col_1': [0, 1, 2, 3], 'col_2': [4, 5, 6, 7]} df1 = pd.DataFrame(data) additional_data = {'col_3': [8, 9, 10, 11], 'col_4': [12, 13, 14, 15]} df2 = pd.DataFrame(additional_data) df1.join(df2, how='outer') 

salida:

  col_1 col_2 col_3 col_4 0 0 4 8 12 1 1 5 9 13 2 2 6 10 14 3 3 7 11 15 

Si no desea crear un nuevo DataFrame a partir de datos_adicionales, puede usar algo como esto:

 >>> additional_data = [[8, 9, 10, 11], [12, 13, 14, 15]] >>> df['col3'], df['col4'] = additional_data >>> df col_1 col_2 col3 col4 0 0 4 8 12 1 1 5 9 13 2 2 6 10 14 3 3 7 11 15 

También es posible hacer algo como esto, pero sería un nuevo DataFrame, no una modificación in situ del DataFrame existente:

 >>> additional_header = ['col_3', 'col_4'] >>> additional_data = [[8, 9, 10, 11], [12, 13, 14, 15]] >>> df = pd.DataFrame(data=np.concatenate((df.values.T, additional_data)).T, columns=np.concatenate((df.columns, additional_header))) >>> df col_1 col_2 col_3 col_4 0 0 4 8 12 1 1 5 9 13 2 2 6 10 14 3 3 7 11 15 

Todo lo que necesita hacer es crear las nuevas columnas con datos del dataframe adicional.

 data = {'col_1': [0, 1, 2, 3], 'col_2': [4, 5, 6, 7]} additional_data = {'col_3': [8, 9, 10, 11], 'col_4': [12, 13, 14, 15]} df = pd.DataFrame(data) df2 = pd.DataFrame(additional_data) df[df2.columns] = df2 

df ahora se ve como:

  col_1 col_2 col_3 col_4 0 0 4 8 12 1 1 5 9 13 2 2 6 10 14 3 3 7 11 15 

Los índices del dataframe original se utilizarán como si hubiera realizado una unión izquierda en el lugar. Los datos del dataframe original en columnas con un nombre coincidente en el dataframe adicional se sobrescribirán. Por ejemplo:

 data = {'col_1': [0, 1, 2, 3], 'col_2': [4, 5, 6, 7]} additional_data = {'col_2': [8, 9, 10, 11], 'col_3': [12, 13, 14, 15]} df = pd.DataFrame(data) df2 = pd.DataFrame(additional_data, index=[0,1,2,4]) df[df2.columns] = df2 

df ahora se ve como:

  col_1 col_2 col_3 0 0 8 12 1 1 9 13 2 2 10 14 3 3 NaN NaN