Crear nuevas columnas basadas en un árbol como patrón

pc_pyr:

Tengo una trama de datos:

col1                 col2                col3
basic                c                   abc
c                    c++                 def
c++                  java                ghi
ruby                                     jkl
php                                      mno
java                 python              pqr
python                                   stu
r                                        vwx
c#                                       yz

Quiero crear nuevas columnas basada en el patrón seguido en la jerarquía trama de datos.
Por ejemplo, en la trama de datos por encima de basic->c->c++->java->pythonorden puede ser observado desde col1 y col2.

Lógica:

valor de col1 basictiene cvalor col2, de manera similar cvalor col1corresponde a c++en col2, c++conduce a javaen col2y finalmente javaa pythonen col2.
Restante valores en "col1", que tienen espacios en blanco correspondientes en col2sería en blanco izquierda en las columnas recién creados así. (es decir, se consideran únicamente los valores en "col1", que no tienen espacios en blanco col2).

Además, col3no tiene ningún papel que desempeñar en la parte lógica.

Así que mi trama de datos de salida sería:

col1          col2       col3           new_col1         new_col2       new_col3     new_col4
basic         c          abc            c                c++            java         python
c             c++        def            c++              java           python
c++           java       ghi            java             python            
ruby                     jkl
php                      mno
java          python     pqr            python
python                   stu
r                        vwx
c#                       yz

Gracias !

el original:

Esto se puede resolver a través de la teoría de grafos análisis. Parece que desea que el camino más largo a partir de cada uno de los nodos col2. Para eso necesitamos a primera construcción de un grafo dirigido usando las columnas col1y col2. Podemos utilizar NetworkX para eso, y construir una nx.DiGraphde la trama de datos utilizando nx.from_pandas_edgelist:

import networkx as nx

m = df[['col1', 'col2']].ne('').all(1)
G = nx.from_pandas_edgelist(df[m], 
                            source='col1', 
                            target='col2', 
                            create_using=nx.DiGraph())

Y entonces podemos iterar sobre el nodesen col2, y la búsqueda de la trayectoria más larga en el Dirigido acíclicos Gráfico usandonx.dag_longest_path

longest_paths = []
for node in df.loc[m,'col2']:
    path = nx.dag_longest_path(G, node)
    if node not in path:
        longest_paths.append('')
        continue
    longest_paths.append(path[path.index(node):])

Ahora podemos asignar vuelta la lista de rutas más largas con:

out = (df.assign(
         **pd.DataFrame(longest_paths, index=df[m].index)
         .reindex(df.index)
         .fillna('')
         .add_prefix('new_col')))

print(out)

     col1    col2  col3  new_col0  new_col1  new_col2  new_col3
0   basic       c   abc         c       c++      java    python
1       c     c++   def       c++      java    python         
2     c++    java   ghi      java    python                  
3    ruby           jkl                                     
4     php           mno                                     
5    java  python   pqr    python                           
6  python           stu                                     
7       r           vwx                                     
8       c            yz       

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=406036&siteId=1
Recomendado
Clasificación