Tengo un df como este:
frame = pd.DataFrame({'a' : ['a,b,c', 'a,c,f', 'b,d,f','a,z,c']})
Y una lista de artículos:
letters = ['a','c']
Mi objetivo es obtener todas las filas frame
que contienen al menos los 2 elementos enletters
Se me ocurrió esta solución:
for i in letters:
subframe = frame[frame['a'].str.contains(i)]
Esto me da lo que quiero, pero podría no ser la mejor solución en términos de escalabilidad. ¿Hay alguna solución 'vectorizada'? Gracias
Respuestas:
Construiría una lista de Series y luego aplicaría un vectorizado
np.all
:Da como se esperaba:
fuente
Una forma es dividir los valores de las columnas en listas usando
str.split
, y verificar siset(letters)
es unasubset
de las listas obtenidas:Punto de referencia:
fuente
TypeError: unhashable type: 'set'
cuando ejecuto su código? lo ejecutó en el marco proporcionado anteriormente1.0.3
y python3.7
probablemente solo soy yoPuedes usar
np.intersect1d
:fuente
Esto también lo resuelve:
fuente
Utilice set.issubset :
fuente
IIUC
explode
y un filtro booleanola idea es crear una serie única, luego podemos agrupar por índice el recuento de las ocurrencias verdaderas de su lista usando una suma acumulativa
fuente
salida:
cronométralo
salida
fuente