pandas
Fusionar, unir y concatenar
Buscar..
Sintaxis
Marco de datos. fusionar (a la derecha, cómo = 'interno', en = Ninguna, left_on = Ninguna, right_on = Ninguna, left_index = False, right_index = False, sort = False, sufijos = ('_ x', '_y'), copy = True, indicador = falso )
Combine los objetos DataFrame realizando una operación de combinación de estilo de base de datos por columnas o índices.
Si se unen columnas en columnas, los índices de DataFrame se ignorarán. De lo contrario, si se unen índices en índices o índices en una columna o columnas, se pasará el índice.
Parámetros
Parámetros | Explicación |
---|---|
Correcto | Marco de datos |
cómo | {'izquierda', 'derecha', 'exterior', 'interno'}, por defecto 'interno' |
dejado en | etiqueta o lista, o como una matriz. Los nombres de los campos para unirse en el marco de datos izquierdo. Puede ser un vector o una lista de vectores de la longitud del DataFrame para usar un vector particular como la clave de unión en lugar de columnas |
tocar el asunto exacto | etiqueta o lista, o como una matriz. Nombres de campo para unir en el marco de datos correcto o vector / lista de vectores por documentos left_on |
left_index | booleano, por defecto Falso. Utilice el índice del DataFrame izquierdo como la (s) clave (s) de unión. Si es un MultiIndex, el número de claves en el otro DataFrame (ya sea el índice o un número de columnas) debe coincidir con el número de niveles |
right_index | booleano, por defecto Falso. Utilice el índice del DataFrame correcto como la clave de unión. Las mismas advertencias que left_index |
ordenar | booleano, por defecto Fals. Ordenar las claves de unión lexicográficamente en el resultado DataFrame |
sufijos | Secuencia de 2 longitudes (tupla, lista, ...). Sufijo para aplicar a los nombres de columnas superpuestas en el lado izquierdo y derecho, respectivamente |
dupdo | booleano, por defecto verdadero. Si es falso, no copie datos innecesariamente |
indicador | booleano o cadena, predeterminado Falso. Si es verdadero, agrega una columna para generar el marco de datos llamado "_merge" con información sobre el origen de cada fila. Si es una cadena, la columna con información sobre el origen de cada fila se agregará a DataFrame de salida, y la columna se llamará valor de cadena. La columna de información es de tipo categórico y toma un valor de "left_only" para las observaciones cuya clave de combinación solo aparece en el marco de datos 'izquierdo', 'right_only' para las observaciones cuya clave de combinación solo aparece en el correcto 'DataFrame' y 'ambos' si La clave de combinación de la observación se encuentra en ambos. |
Unir
Por ejemplo, se dan dos tablas,
T1
id x y
8 42 1.9
9 30 1.9
T2
id signal
8 55
8 56
8 59
9 57
9 58
9 60
El objetivo es conseguir la nueva tabla T3:
id x y s1 s2 s3
8 42 1.9 55 56 58
9 30 1.9 57 58 60
Lo que consiste en crear las columnas s1
, s2
y s3
, cada una correspondiente a una fila (el número de filas por id
siempre es fijo e igual a 3)
Aplicando join
(que toma un opcional en el argumento que puede ser una columna o varios nombres de columna, que especifica que el DataFrame pasado se alineará en esa columna en el DataFrame). Así que la solución puede ser como se muestra a continuación:
df = df1.merge (df2.groupby ('id') ['señal']. apply (lambda x: x.reset_index (drop = True)). unstack (). reset_index ())
df
Out[63]:
id x y 0 1 2
0 8 42 1.9 55 56 59
1 9 30 1.9 57 58 60
Si los separo:
df2t = df2.groupby('id')['signal'].apply(lambda x: x.reset_index(drop=True)).unstack().reset_index()
df2t
Out[59]:
id 0 1 2
0 8 55 56 59
1 9 57 58 60
df = df1.merge(df2t)
df
Out[61]:
id x y 0 1 2
0 8 42 1.9 55 56 59
1 9 30 1.9 57 58 60
Fusionando dos DataFrames
In [1]: df1 = pd.DataFrame({'x': [1, 2, 3], 'y': ['a', 'b', 'c']})
In [2]: df2 = pd.DataFrame({'y': ['b', 'c', 'd'], 'z': [4, 5, 6]})
In [3]: df1
Out[3]:
x y
0 1 a
1 2 b
2 3 c
In [4]: df2
Out[4]:
y z
0 b 4
1 c 5
2 d 6
Unir internamente:
Utiliza la intersección de claves de dos DataFrames.
In [5]: df1.merge(df2) # by default, it does an inner join on the common column(s)
Out[5]:
x y z
0 2 b 4
1 3 c 5
Alternativamente, especifique la intersección de claves de dos Dataframes.
In [5]: merged_inner = pd.merge(left=df1, right=df2, left_on='y', right_on='y')
Out[5]:
x y z
0 2 b 4
1 3 c 5
Unión externa:
Utiliza la unión de las claves de dos DataFrames.
In [6]: df1.merge(df2, how='outer')
Out[6]:
x y z
0 1.0 a NaN
1 2.0 b 4.0
2 3.0 c 5.0
3 NaN d 6.0
Unirse a la izquierda:
Utiliza solo claves de DataFrame izquierdo.
In [7]: df1.merge(df2, how='left')
Out[7]:
x y z
0 1 a NaN
1 2 b 4.0
2 3 c 5.0
Unirse a la derecha
Utiliza solo claves del DataFrame correcto.
In [8]: df1.merge(df2, how='right')
Out[8]:
x y z
0 2.0 b 4
1 3.0 c 5
2 NaN d 6
Fusionar / concatenar / unir múltiples marcos de datos (horizontal y verticalmente)
generar marcos de datos de muestra:
In [57]: df3 = pd.DataFrame({'col1':[211,212,213], 'col2': [221,222,223]})
In [58]: df1 = pd.DataFrame({'col1':[11,12,13], 'col2': [21,22,23]})
In [59]: df2 = pd.DataFrame({'col1':[111,112,113], 'col2': [121,122,123]})
In [60]: df3 = pd.DataFrame({'col1':[211,212,213], 'col2': [221,222,223]})
In [61]: df1
Out[61]:
col1 col2
0 11 21
1 12 22
2 13 23
In [62]: df2
Out[62]:
col1 col2
0 111 121
1 112 122
2 113 123
In [63]: df3
Out[63]:
col1 col2
0 211 221
1 212 222
2 213 223
fusionar / unir / concatenar marcos de datos [df1, df2, df3] verticalmente - agregar filas
In [64]: pd.concat([df1,df2,df3], ignore_index=True)
Out[64]:
col1 col2
0 11 21
1 12 22
2 13 23
3 111 121
4 112 122
5 113 123
6 211 221
7 212 222
8 213 223
fusionar / unir / concatenar marcos de datos horizontalmente (alineación por índice):
In [65]: pd.concat([df1,df2,df3], axis=1)
Out[65]:
col1 col2 col1 col2 col1 col2
0 11 21 111 121 211 221
1 12 22 112 122 212 222
2 13 23 113 123 213 223
Fusionar, Unir y Concat
Fusionar nombres de claves son iguales
pd.merge(df1, df2, on='key')
Fusionar nombres de claves son diferentes
pd.merge(df1, df2, left_on='l_key', right_on='r_key')
Diferentes tipos de unión.
pd.merge(df1, df2, on='key', how='left')
Fusionando en múltiples claves
pd.merge(df1, df2, on=['key1', 'key2'])
Tratamiento de columnas superpuestas
pd.merge(df1, df2, on='key', suffixes=('_left', '_right'))
Usando el índice de filas en lugar de combinar claves
pd.merge(df1, df2, right_index=True, left_index=True)
Evite el uso de la sintaxis .join
ya que da una excepción para las columnas superpuestas
Fusión en el índice de marco de datos izquierdo y la columna de marco de datos derecha
pd.merge(df1, df2, right_index=True, left_on='l_key')
Marcos de datos concate
Pegado verticalmente
pd.concat([df1, df2, df3], axis=0)
Pegado horizontalmente
pd.concat([df1, df2, df3], axis=1)
¿Cuál es la diferencia entre unirse y fusionarse?
Considere los marcos de datos de left
y right
left = pd.DataFrame([['a', 1], ['b', 2]], list('XY'), list('AB'))
left
A B
X a 1
Y b 2
right = pd.DataFrame([['a', 3], ['b', 4]], list('XY'), list('AC'))
right
A C
X a 3
Y b 4
join
Piense en join
como si quisiera combinarlos a los marcos de datos en función de sus índices respectivos. Si hay columnas superpuestas, join
querrá que agregue un sufijo al nombre de la columna superpuesta del marco de datos de la izquierda. Nuestros dos marcos de datos tienen un nombre de columna superpuesto A
left.join(right, lsuffix='_')
A_ B A C
X a 1 a 3
Y b 2 b 4
Note que el índice se conserva y tenemos 4 columnas. 2 columnas de left
y 2 de right
.
Si los índices no se alineaban
left.join(right.reset_index(), lsuffix='_', how='outer')
A_ B index A C
0 NaN NaN X a 3.0
1 NaN NaN Y b 4.0
X a 1.0 NaN NaN NaN
Y b 2.0 NaN NaN NaN
Utilicé una combinación externa para ilustrar mejor el punto. Si los índices no se alinean, el resultado será la unión de los índices.
Podemos decirle a join
que use una columna específica en el marco de datos de la izquierda para usarla como clave de join, pero seguirá usando el índice de la derecha.
left.reset_index().join(right, on='index', lsuffix='_')
index A_ B A C
0 X a 1 a 3
1 Y b 2 b 4
merge
Piense en la merge
como alineación en columnas. Por defecto, la merge
buscará columnas superpuestas en las que se fusionará. merge
proporciona un mejor control sobre las claves de combinación al permitir al usuario especificar un subconjunto de las columnas superpuestas para usar con el parámetro on
, o permitir por separado la especificación de qué columnas de la izquierda y qué columnas de la derecha se fusionan.
merge
devolverá un marco de datos combinado en el que se destruirá el índice.
Este sencillo ejemplo encuentra que la columna superpuesta es 'A'
y se combina en función de ella.
left.merge(right)
A B C
0 a 1 3
1 b 2 4
Tenga en cuenta que el índice es [0, 1]
y ya no es ['X', 'Y']
Puede especificar explícitamente que está fusionando en el índice con la left_index
o right_index
parametro
left.merge(right, left_index=True, right_index=True, suffixes=['_', ''])
A_ B A C
X a 1 a 3
Y b 2 b 4
Y esto se ve exactamente como el ejemplo de join
anterior.