Objetivo

Para fusionar el archivo df_labelled con una parte de los puntos etiquetados en df donde contiene todo el punto.

Lo que he probado

Refiriéndose a Manera simple de concatenar Dask (horizontal, eje = 1, columnas), probé el siguiente código

df = df.repartition(npartitions=200)
df = df.reset_index(drop=True)
df_labelled = df_labelled.repartition(npartitions=200)
df_labelled = df_labelled.reset_index(drop=True)

df = df.assign(label = df_labelled.label)
df.head()

Pero luego recibo el error

ValueError: Not all divisions are known, can't align partitions. Please use `set_index` to set the index.

Otra cosa que he intentado es hacer la unión izquierda de la tabla, pero obtuve NaN para todas las etiquetas, ¿puedes explicar qué hice mal?

result = dd.merge(df, df_labelled, on=['x', 'y', 'z','R', 'G', 'B'], how="left")
result.head()

    x               y               z           R   G   B   label
0   39020.470000    33884.200003    36.445701   25  39  26  NaN
1   39132.740002    33896.049994    30.405700   19  24  18  NaN
2   39221.059994    33787.050001    26.605700   115 145 145 NaN

¿Hay alguna forma de que pueda lograr el resultado esperado como se muestra a continuación? No puedo ejecutar en Pandas porque hay muchos puntos que causarán problemas de memoria en Pandas.

Datos

Df (este archivo tiene todos los puntos)

    x               y               z           R   G   B
0   39047.700012    33861.890015    48.115704   7   18  12  
1   39044.110016    33860.150024    47.135700   14  28  15
2   39049.280029    33861.950073    49.405701   30  58  33
3   39029.030000    33937.689993    48.425700   152 154 143
4   39066.980000    33937.870001    49.725699   209 218 225
5   39069.810002    33795.460001    42.405699   113 136 154

Df_labelled (este archivo contiene una parte de puntos etiquetados)

    x               y               z           R   G   B   label
0   39047.700012    33861.890015    48.115704   7   18  12  14
1   39044.110016    33860.150024    47.135700   14  28  15  14
2   39049.280029    33861.950073    49.405701   30  58  33  14

Resultado esperado

    x               y               z           R   G   B   label
0   39047.700012    33861.890015    48.115704   7   18  12  14
1   39044.110016    33860.150024    47.135700   14  28  15  14
2   39049.280029    33861.950073    49.405701   30  58  33  14
3   39029.030000    33937.689993    48.425700   152 154 143 nan
4   39066.980000    33937.870001    49.725699   209 218 225 nan
5   39069.810002    33795.460001    42.405699   113 136 154 nan
0
NordicFox 27 oct. 2020 a las 06:34

1 respuesta

La mejor respuesta

Creo que cuando haces algo como esto, entonces error:

df = df.assign(label = df_labelled.label)

Porque no hay índice en el marco de datos df o / y df_labelled. Y Dask no admite índices múltiples como Pandas. En lugar de utilizar el índice, defina la tecla izquierda y la tecla derecha si tiene más de una clave para fusionar el marco de datos en Dask. Este me funciona:

result = dd.merge(df, df_labelled, left_on=['x', 'y', 'z','R', 'G', 'B'], right_on = ['x', 'y', 'z','R', 'G', 'B'],  suffixes=['_1', '_2'], how="left")
0
Fariliana Eri 27 oct. 2020 a las 04:03