Agregar columna al marco de datos de pandas

104

Probablemente sea fácil, pero tengo los siguientes datos:

En el marco de datos 1:

index dat1
0     9
1     5

En el marco de datos 2:

index dat2
0     7
1     6

Quiero un marco de datos con la siguiente forma:

index dat1  dat2
0     9     7
1     5     6

Intenté usar el appendmétodo, pero obtengo una combinación cruzada (es decir, producto cartesiano).

¿Cuál es la forma correcta de hacer esto?

BenDundee
fuente
2
¿Probaste el joinmétodo?
BrenBarn
1
data_frame_1 ['dat2'] = data_frame_2 ['dat2']
lowtech
@lowtech: ¿eso garantiza que los índices estén emparejados correctamente?
BenDundee
@BenDundee: sí lo hace
lowtech

Respuestas:

131

Parece que, en general, solo estás buscando una combinación:

> dat1 = pd.DataFrame({'dat1': [9,5]})
> dat2 = pd.DataFrame({'dat2': [7,6]})
> dat1.join(dat2)
   dat1  dat2
0     9     7
1     5     6
U2EF1
fuente
45
O pd.concat([dat1, dat2], axis=1)en este caso.
DSM
2
@BenDundee Join y concat usan mucho del mismo código bajo el capó, por lo que la forma "correcta" probablemente solo importe cuando se consideran casos extremos. Por ejemplo, aquí, si ambos DataFrames tuvieran una columna de 'datos', la unión fallaría , mientras que una concat le daría dos columnas llamadas 'datos'.
U2EF1
@ U2EF1: Estaba hablando de tu respuesta frente a la mía. Siempre hay N formas de despellejar a un gato :)
BenDundee
@BenDundee Ya veo. Sin embargo, ese método descarta el índice único y tiene efectos secundarios aún más extraños en casos más complicados. Por ejemplo, si tuviera dos columnas llamadas 'datos', la agrupación / suma comenzaría a resumir las diferentes columnas de datos, lo que casi con seguridad no es lo que desea. Los datos de cadena se concatenarían.
U2EF1
1
Como señaló @ jeremy-z, es muy importante restablecer los índices en ambos conjuntos de datos si no comparten el mismo índice. De lo contrario, obtendrá un conjunto de datos con muchas filas de NaN.
Israel Varea
57

También puedes usar:

dat1 = pd.concat([dat1, dat2], axis=1)
Ella Cohen
fuente
1
En caso de que lo encuentre InvalidIndexError: Reindexing only valid with uniquely valued Index objects , puede utilizar:pd.concat([dat1.reset_index(), dat2], axis=1)
beyondfloatingpoint
40

Ambos join()y la concat()forma podrían resolver el problema. Sin embargo, hay una advertencia que debo mencionar: restablezca el índice antes que usted join()o concat()si intenta lidiar con algún marco de datos seleccionando algunas filas de otro DataFrame.

Un ejemplo a continuación muestra un comportamiento interesante de join y concat:

dat1 = pd.DataFrame({'dat1': range(4)})
dat2 = pd.DataFrame({'dat2': range(4,8)})
dat1.index = [1,3,5,7]
dat2.index = [2,4,6,8]

# way1 join 2 DataFrames
print(dat1.join(dat2))
# output
   dat1  dat2
1     0   NaN
3     1   NaN
5     2   NaN
7     3   NaN

# way2 concat 2 DataFrames
print(pd.concat([dat1,dat2],axis=1))
#output
   dat1  dat2
1   0.0   NaN
2   NaN   4.0
3   1.0   NaN
4   NaN   5.0
5   2.0   NaN
6   NaN   6.0
7   3.0   NaN
8   NaN   7.0

#reset index 
dat1 = dat1.reset_index(drop=True)
dat2 = dat2.reset_index(drop=True)
#both 2 ways to get the same result

print(dat1.join(dat2))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7


print(pd.concat([dat1,dat2],axis=1))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7
Jeremy Z
fuente
Bien dicho y buen punto. Intenté sin restablecer el índice y generé muchos NULLS
Anand
Sin hacer el paso de restablecimiento, mis datos se veían bien, pero obviamente algo no funcionó bien detrás de escena. ¡Gracias por mencionarlo! ¡El reinicio puso mi modelo en funcionamiento!
Ionuț Ciuta
¡Esta debería ser la respuesta aceptada! Siempre genera NaN s si no restablecemos el índice.
Srivatsan
Este paso me salvó. Estaba tratando de entender por qué concat y join arrojaban muchos NaN. Gracias por compartir esto.
Gustavo Rottgering
0

De hecho:

data_joined = dat1.join(dat2)
print(data_joined)
Raj Stha
fuente
-3

Solo es cuestión de la búsqueda correcta en Google:

data = dat_1.append(dat_2)
data = data.groupby(data.index).sum()
BenDundee
fuente