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->python
orden puede ser observado desde col1 y col2.
Lógica:
valor de col1 basic
tiene c
valor col2
, de manera similar c
valor col1
corresponde a c++
en col2, c++
conduce a java
en col2
y finalmente java
a python
en col2
.
Restante valores en "col1", que tienen espacios en blanco correspondientes en col2
serí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, col3
no 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 !
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 col1
y col2
. Podemos utilizar NetworkX para eso, y construir una nx.DiGraph
de 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 nodes
en 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