Ich habe einen df wie diesen:
frame = pd.DataFrame({'a' : ['a,b,c', 'a,c,f', 'b,d,f','a,z,c']})
Und eine Liste von Gegenständen:
letters = ['a','c']
Mein Ziel ist es, alle Zeilen zu erhalten frame
, die mindestens die 2 Elemente enthaltenletters
Ich habe mir diese Lösung ausgedacht:
for i in letters:
subframe = frame[frame['a'].str.contains(i)]
Dies gibt mir, was ich will, aber es ist möglicherweise nicht die beste Lösung in Bezug auf Skalierbarkeit. Gibt es eine "vektorisierte" Lösung? Vielen Dank
Antworten:
Ich würde eine Liste von Serien erstellen und dann eine vektorisierte anwenden
np.all
:Es gibt wie erwartet:
quelle
Eine Möglichkeit besteht darin, die Spaltenwerte mithilfe von Listen in Listen aufzuteilen
str.split
und zu überprüfen, obset(letters)
es sich um einesubset
der erhaltenen Listen handelt:Benchmark:
quelle
TypeError: unhashable type: 'set'
wenn ich Ihren Code ausführe? lief es auf dem bereitgestellten Rahmen aboe1.0.3
und Python ist3.7
wahrscheinlich nur ichSie können verwenden
np.intersect1d
:quelle
Dies löst es auch:
quelle
Verwenden Sie set.issubset :
quelle
IIUC
explode
und ein Boolescher FilterDie Idee ist, eine einzelne Reihe zu erstellen, dann können wir anhand des Index die Anzahl der wahren Vorkommen Ihrer Liste anhand einer kumulativen Summe gruppieren
quelle
Ausgabe:
timeit
Ausgabe
quelle