/ / Unirse a 3 marcos de datos de panda - python, pandas, join

Unirse a 3 marcos de datos de panda: python, pandas, join

Permítanme comenzar diciendo esto, no estoy seguro siesta es la mejor manera de hacerlo, pero escribí un código para crear un marco de datos de pandas "que contiene los valores de índice de mi marco de datos izquierdo y uno de mi marco de datos derecho donde coinciden condiciones espaciales específicas. Esta es su unión espacial básica, pero con Algunos atributos adicionales. Los valores del índice son correctos.

Mi problema es este: ¿cómo puedo unir el marco de datos izquierdo y derecho junto con este tercer marco de datos?

Necesito apoyar lo siguiente:

  1. Si quiero mantener todo (tanto de df1 como de df2), ¿cómo hago eso?
  2. De forma predeterminada, quiero mantener todos los valores del marco de datos izquierdo, por lo que mi marco de datos de unión tiene valores como: [1, None] ¿Será esto un problema?

Ejemplo:

 join_df = pd.DataFrame(data=[[0, 2], [1, 3], [2, None]], columns=["left_idx", "right_idx"])
df1 = pd.DataFrame([["a", {5:5}], ["b", {4:5}], ["c", {12:5}]], columns=["A1", "A2"])
df2 = pd.DataFrame([["b", {"a":5}], ["bbb", {"b":5}], ["ccc", {"c":5}]], columns=["B1", "B2"])

Así que el join_df funciona así:

  1. Los datos en join_df son el índice del marco de datos izquierdo (df1) y la fila para unir desde df2 está en la columna 2.
  2. La unión puede ser de muchos a muchos, 1: m, o de muchos a 1.

El objetivo es que todas las filas de df1 coincidan con todas las filas de df2. Opcionalmente, (pregunta adicional), si no existe una coincidencia en df1 a df2, ¿se puede mantener el registro de df1? ¿Lo mismo ocurre con df2?

Gracias

Respuestas

1 para la respuesta № 1

Puedes usar DataFrame.merge y emparejar en la columna izquierda de join_df y el índice de df1 o df2. Utilizando how="left" resultará en un DataFrame que solo incluye los valores especificados en join_df.

join_df = join_df.merge(df1, left_on="left_idx", right_index=True, how="left")
join_df = join_df.merge(df2, left_on="right_idx", right_index=True, how="left")

Esto da:

   left_idx  right_idx A1       A2   B1         B2
0         0        2.0  a   {5: 5}  ccc  {u"c": 5}
1         1        3.0  b   {4: 5}  NaN        NaN
2         2        NaN  c  {12: 5}  NaN        NaN

Puede excluir el idx columnas especificando join_df[df1.columns | df2.columns]. Puedes usar how="outer" si desea evitar la caída de valores, pero es posible que deba ajustar el resultado para que coincida con la salida deseada.