una seleccionar nueva insertar filtrar filas fila datos columnas columna python pandas dataframe merge concat

python - seleccionar - Combina dos marcos de datos por índice



seleccionar una columna pandas (5)

Hola, tengo los siguientes marcos de datos:

> df1 id begin conditional confidence discoveryTechnique 0 278 56 false 0.0 1 1 421 18 false 0.0 1 > df2 concept 0 A 1 B

¿Cómo me fusiono en los índices para obtener:

id begin conditional confidence discoveryTechnique concept 0 278 56 false 0.0 1 A 1 421 18 false 0.0 1 B

Pregunto porque entiendo que merge() es decir, df1.merge(df2) usa columnas para hacer la correspondencia. De hecho, al hacer esto obtengo:

Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 4618, in merge copy=copy, indicator=indicator) File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 58, in merge copy=copy, indicator=indicator) File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 491, in __init__ self._validate_specification() File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 812, in _validate_specification raise MergeError(''No common columns to perform merge on'') pandas.tools.merge.MergeError: No common columns to perform merge on

¿Es una mala práctica fusionarse en el índice? ¿Es imposible? Si es así, ¿cómo puedo cambiar el índice a una nueva columna llamada "índice"?

Gracias


Si desea unir dos marcos de datos en pandas, simplemente puede usar los atributos disponibles como merge o concatenate . Por ejemplo, si tengo dos marcos de datos df1 y df2 , puedo unirlos de la siguiente manera:

newdataframe=merge(df1,df2,left_index=True,right_index=True)


Un error tonto que me atrapó: las uniones fallaron porque los tipos de índice diferían. Esto no era obvio ya que ambas tablas eran tablas dinámicas de la misma tabla original. Después de reset_index, los índices se veían idénticos en jupyter. Solo salió a la luz al guardar para sobresalir ...

Solucionado con: df1[[''key'']] = df1[[''key'']].apply(pd.to_numeric)

¡Ojalá esto le ahorre a alguien una hora!


Use merge , que es la unión interna de forma predeterminada:

pd.merge(df1, df2, left_index=True, right_index=True)

O join , que se deja unir por defecto:

df1.join(df2)

O concat , que es la unión externa por defecto:

pd.concat([df1, df2], axis=1)

Muestras :

df1 = pd.DataFrame({''a'':range(6), ''b'':[5,3,6,9,2,4]}, index=list(''abcdef'')) print (df1) a b a 0 5 b 1 3 c 2 6 d 3 9 e 4 2 f 5 4 df2 = pd.DataFrame({''c'':range(4), ''d'':[10,20,30, 40]}, index=list(''abhi'')) print (df2) c d a 0 10 b 1 20 h 2 30 i 3 40

#default inner join df3 = pd.merge(df1, df2, left_index=True, right_index=True) print (df3) a b c d a 0 5 0 10 b 1 3 1 20 #default left join df4 = df1.join(df2) print (df4) a b c d a 0 5 0.0 10.0 b 1 3 1.0 20.0 c 2 6 NaN NaN d 3 9 NaN NaN e 4 2 NaN NaN f 5 4 NaN NaN #default outer join df5 = pd.concat([df1, df2], axis=1) print (df5) a b c d a 0.0 5.0 0.0 10.0 b 1.0 3.0 1.0 20.0 c 2.0 6.0 NaN NaN d 3.0 9.0 NaN NaN e 4.0 2.0 NaN NaN f 5.0 4.0 NaN NaN h NaN NaN 2.0 30.0 i NaN NaN 3.0 40.0


por defecto:
unirse es una combinación izquierda en columna
pd.merge es una combinación interna en columnas
pd.concat es una combinación externa en fila

pd.concat:
toma argumentos Iterables. Por lo tanto, no puede tomar DataFrames directamente (use [df, df2])
Las dimensiones de DataFrame deben coincidir a lo largo del eje

Únete y pd.merge:
puede tomar argumentos de DataFrame


puede usar concat para concatenar dos o más DF alineados por índices:

pd.concat([df1, df2, df3, ...], axis=1)

o merge para concatenar por campos / índices personalizados:

# join by _common_ columns: `col1`, `col3` pd.merge(df1, df2, on=[''col1'',''col3'']) # join by: `df1.col1 == df2.index` pd.merge(df1, df2, left_on=''col1'' right_index=True)

o join para unirse por índice:

df1.join(df2)