Agrupa y devuelve todos los valores de índice donde existe una subcadena de texto en una columna.
Tengo un df con la siguiente estructura:
vid sid pid url
1 A A1 page ABCDEF
2 A A1 page DEF123
3 A A1 page GHI345
4 A A1 page JKL345
5 B B1 page AB12345EF
6 B B2 page IJK
7 B B2 page XYZ
8 C C1 page ABCEF
dict = {'vid':{1:'A',2:'A',3:'A',4:'A',5:'B',6:'B',7:'B',8:'C'},
'sid':{1:'A1',2:'A1',3:'A1',4:'A1',5:'B1',6:'B2',7:'B2#39;,8:'C1'},
'page':{1:'page',2:'page',3:'page',4:'page',5:'page',6:'page',7:'page',8:'pge'},
'url':{1:'ABC',2:'DEF',3:'GHI',4:'JKL',5:'ABC',6:'IJK',7:'XYZ',8:'ABC'}
}
También tengo una lista de subcadenas:
lst = ['AB','EF']
Básicamente, quiero agrupar por sid
y verificar cada fila en url
. Si todos los elementos de la lista existen como subcadena en al menos una fila, entonces devolver el sid
. Si no, filtrar el sid
del df. Las subcadenas dentro de url
no son secuenciales.
Pseudocódigo:
agrupar por sid
si la fila en url contiene todas las subcadenas en lst
pasar
si ninguna fila en url contiene todas las subcadenas en lst
eliminar el `sid` del df
Resultado de aplicar la lógica anterior al df usando lst
:
enter code here
vid sid pid url
1 A A1 page ABCDEF
2 A A1 page DEF123
3 A A1 page GHI345
4 A A1 page JKL345
5 B B1 page AB12345EF
8 C C1 page ABCEF
davy.ai
Para obtener el resultado deseado, podemos usar una combinación de los métodos
groupby()
,apply()
ystr.contains()
de Pandas. Aquí está el código:Aquí hay un desglose paso a paso de lo que hace el código:
df
) y el diccionario (dict
) con la estructura dada.dict_df
).df
ydict_df
) por índice para obtener una tabla completa.lst
).check_substr
) que comprueba si todas las subcadenas enlst
existen en una fila deurl
.sid
, luego aplicar la funcióncheck_substr
a cada grupo usandoapply()
.sid
s que no tienen todas las subcadenas en al menos una fila usando los métodosduplicated()
yunique()
.df
) por lossid
s filtrados para obtener el resultado deseado.El dataframe resultante (
result
) debería ser: