Python Pandas fusiona solo ciertas columnas

109

¿Es posible fusionar solo algunas columnas? Tengo un DataFrame df1 con columnas x, y, zy df2 con columnas x, a, b, c, d, e, f, etc.

Quiero fusionar los dos DataFrames en x, pero solo quiero fusionar las columnas df2.a, df2.b, no todo el DataFrame.

El resultado sería un DataFrame con x, y, z, a, b.

Podría fusionar y luego eliminar las columnas no deseadas, pero parece que hay un método mejor.

BubbleGuppies
fuente
1
Andy: Dios mío, fue fácil ... Necesito un descanso, obviamente lo estoy haciendo demasiado complicado. ¡Gracias por la claridad!
BubbleGuppies

Respuestas:

81

Puede fusionar el sub-DataFrame (solo con esas columnas):

df2[list('xab')]  # df2 but only with columns x, a, and b

df1.merge(df2[list('xab')])
Andy Hayden
fuente
6
Hmmm, me pregunto si debería haber una forma nativa de hacer esto, como subconjunto en dropna ... armará el problema de github
Andy Hayden
Hmmm ... Intenté usar esto para fusionar la columna 'Unique_External_Users' de df2 a df1 pero obtuve un error ... "Ninguno de [Index (['U', 'n', 'i', 'q', 'u ',' e ',' ',' E ',' x ',' t ',' e ',' r ',' n ',' a ', \ n' l ',' ',' U ', 's', 'e', ​​'r', 's'], \ n dtype = 'objeto')] están en las [columnas] ".
CoolDocMan
Aquí está el código. ... df1.merge (df2 ('Unique_External_Users')])
CoolDocMan
1
@CoolDocMan Creo que se perdió algo de la respuesta propuesta: list('xab')toma cada elemento (letra) de la cadena 'xab' y lo convierte en un elemento de lista para que list('xab')regrese ['x', 'a', 'b']. Eso funciona si cada columna tiene una sola letra como nombre. En su caso, creo que necesita hacer df1.merge (df2 ['Unique_External_Users'], * other_arguments). ... Lo más probable es que ya lo hayas resuelto, dejando esto para los novatos, como yo
SOf_PUAR
114

Desea usar DOS corchetes, por lo que si está haciendo un tipo de acción BUSCARV:

df = pd.merge(df,df2[['Key_Column','Target_Column']],on='Key_Column', how='left')

Esto le dará todo en el df original + agregue la columna correspondiente en df2 a la que desea unirse.

Arthur D. Howland
fuente
11

Si desea eliminar la (s) columna (s) del marco de datos de destino, pero las columnas son necesarias para la combinación, puede hacer lo siguiente:

df1 = df1.merge(df2[['a', 'b', 'key1']], how = 'left',
                left_on = 'key2', right_on = 'key1').drop('key1')

La .drop('key1')parte evitará que 'key1' se mantenga en el marco de datos resultante, a pesar de que se requiere unirse en primer lugar.

tonneofash
fuente
4
Recibo el siguiente error si intento esto:KeyError: "['key1'] not found in axis"
Tanya Branagan
3
intente .drop (columnas = ['key1'])
psangam
O .drop ('key1', axis = 1)
tonneofash
8

Puede usar .locpara seleccionar las columnas específicas con todas las filas y luego extraerlas. A continuación se muestra un ejemplo:

pandas.merge(dataframe1, dataframe2.iloc[:, [0:5]], how='left', on='key')

En este ejemplo, está fusionando dataframe1 y dataframe2. Ha elegido hacer una combinación exterior izquierda en 'clave'. Sin embargo, para dataframe2 ha especificado lo .ilocque le permite especificar las filas y columnas que desea en un formato numérico. Usando :, selecciona todas las filas, pero [0:5]selecciona las primeras 5 columnas. Puede usar .locpara especificar por nombre, pero si está tratando con nombres de columna largos, entonces .ilocpuede ser mejor.

Terrance DeJesus
fuente
1
Tenga cuidado que .lochará una copia , y en un gran df que puede ser doloroso. Podría ser mejor fusionar y luego tomar inmediatamente un segmento de columna en la misma expresión.
smci
7

Esto es para fusionar columnas seleccionadas de dos tablas.

Si table_1contiene t1_a,t1_b,t1_c..,id,..t1_zcolumnas y table_2contiene t2_a, t2_b, t2_c..., id,..t2_zcolumnas, y solo se requieren t1_a, id, t2_a en la tabla final, entonces

mergedCSV = table_1[['t1_a','id']].merge(table_2[['t2_a','id']], on = 'id',how = 'left')
# save resulting output file    
mergedCSV.to_csv('output.csv',index = False)
Marco167
fuente