J'ai un df comme ça:
frame = pd.DataFrame({'a' : ['a,b,c', 'a,c,f', 'b,d,f','a,z,c']})
Et une liste d'articles:
letters = ['a','c']
Mon objectif est d’obtenir toutes les lignes frame
contenant au moins les 2 élémentsletters
J'ai trouvé cette solution:
for i in letters:
subframe = frame[frame['a'].str.contains(i)]
Cela me donne ce que je veux, mais ce n'est peut-être pas la meilleure solution en termes d'évolutivité. Existe-t-il une solution «vectorisée»? Merci
Réponses:
Je construirais une liste de séries, puis appliquerais une vectorisation
np.all
:Il donne comme prévu:
la source
Une façon consiste à diviser les valeurs des colonnes en listes à l'aide de
str.split
et à vérifier s'ilset(letters)
s'agit d'unesubset
des listes obtenues:Référence:
la source
TypeError: unhashable type: 'set'
quand j'exécute votre code? l'a exécuté sur le cadre fourni aboe1.0.3
et python est3.7
probablement juste moiVous pouvez utiliser
np.intersect1d
:la source
Cela le résout également:
la source
Utilisez set.issubset :
la source
IIUC,
explode
et un filtre booléenl'idée est de créer une seule série puis on peut regrouper par l'index le décompte des vraies occurrences de votre liste en utilisant une somme cumulée
la source
production:
timeit
production
la source