Estoy tratando de agrupar según su relación de secuencia entre las dos columnas.
d = {'df1':[10,20, 30, 60, 70, 40, 30, 70], 'df2':[20, 30, 40, 80, 70, 50, 90, 100]}
df = pd.DataFrame(data = d)
df
df1 df2
0 10 20
1 20 30
2 30 40
3 60 80
4 80 70
5 40 50
6 30 90
7 70 100
Espero el resultado algo a continuación:
Para que quede más claro: - df1 y df2 tienen una relación basada en su secuencia. Por ejemplo, 10 tiene una relación directa con 20 y 10 tiene una relación indirecta con 30 a 20. Y también 10 tiene una relación indirecta con 40 a 20 y 30. Un ejemplo adicional, tomemos 80 tiene una relación directa con 70 y relación indirecta con 100 a 70. Esto funciona para el resto de los valores de columna.
df1 | df2
-----|-------------------
0 10 | 20, 30, 40, 50, 90
1 20 | 30, 40, 50, 90
2 30 | 40, 50, 90
3 60 | 80, 70, 100
4 80 | 70, 100
5 40 | 50
6 70 | 100
Estoy tratando de usar el script a continuación, pero no pude tener éxito.
(df.groupby('df1')
.agg({ 'df2' : ','.join})
.reset_index()
.reindex(columns=df.columns))
¿Alguien podría ayudar en este desafío? Si hay alguna solución similar aquí en el desbordamiento de Stack, hágamelo saber.
Editar: la primera respuesta funciona perfectamente con el ejemplo anterior, pero cuando trato con los datos que quiero hacer, no funciona correctamente. mis datos reales se ven a continuación.
df1 df2
0 10 20
1 10 30
2 10 80
3 10 90
4 10 120
5 10 140
6 10 170
7 20 180
8 30 40
9 30 165
10 30 175
11 40 20
12 40 50
13 50 60
14 60 70
15 70 180
16 80 180
17 90 100
18 100 110
19 110 180
20 120 130
21 130 180
22 140 150
23 150 160
24 160 165
25 165 180
26 165 200
27 170 175
28 175 180
29 175 200
30 180 190
31 190 200
32 200 210
33 210 220
34 220 230
35 230 240
36 240 -
Respuestas:
Una posible solución:
Huellas dactilares:
EDITAR: Otra solución basada en nuevos datos de entrada. Ahora estoy buscando posibles círculos en la ruta:
Huellas dactilares:
O
pprint(d, width=250)
:EDITAR 2: Si
df
es su marco de datos de entrada con columnas "df1" y "df2":fuente
d[k].extend(chain.from_iterable(d.get(v, []) for v in d[k]))
funciona esto? Miré el documento, pero no pude seguirlo.chain.from_iterable
para aplanar el iterable: en este caso, el iterable consiste en listas del diccionariod
(o listas vacías, si la clavev
no existe end
-d.get(v, [])
). Luego uso estos valores para extender la lista almacenada end[k]
.if not (line := line.strip().split()):
es decirif not (line != line.strip().split()):
? o algo mas. Estoy recibiendo un error con:
. Cuando lo hago,!=
recibo unIndexError: string index out of range
error en la líneadf1.append(int(line[1]))
.Hola, gracias por la aclaración, tengo una solución con una función recursiva que puedes probar. Puede no ser eficiente para grandes marcos de datos, pero parece funcionar bien. La función devuelve una lista, pero puede editar la serie resultante para unir la lista en una cadena como desee.
fuente
Esto debería funcionar:
Salida:
(*) También verifiqué con el marco de datos extendido: es bastante rápido, no compartiré el resultado, ya que mi IDE lo está truncando;)
fuente
node
(uno de sus parámetros en la función). ¿Podría decirme?node
es el valor en el que se encuentra actualmente. Por lo tanto, lo devuelve y, en caso de que tenga padres, diferentes de sí mismo (llamada referencia circular), itera sobre sus padres y ejecuta la misma función para ellos.<generator object recursive_walk at 0x0000022A67551D48>
. Lo cual es que no sé lo que significa.list(recursive_walk(...))
o la[el for el in recursive_walk(...)]
función devuelvegenerator
, lo que esencialmente significa que no todos los elementos a la vez, como por ejemplo,list
otuple
proporciona iterables que puede usar para devolver todos los valores uno por uno.