Mam takiego df:
frame = pd.DataFrame({'a' : ['a,b,c', 'a,c,f', 'b,d,f','a,z,c']})
I lista przedmiotów:
letters = ['a','c']
Moim celem jest, aby wszystkie wiersze frame
zawierały co najmniej 2 elementyletters
Wymyśliłem to rozwiązanie:
for i in letters:
subframe = frame[frame['a'].str.contains(i)]
To daje mi to, czego chcę, ale może nie być najlepszym rozwiązaniem pod względem skalowalności. Czy istnieje jakieś „wektoryzowane” rozwiązanie? Dzięki
Odpowiedzi:
Zbudowałbym listę Serii, a następnie zastosowałem wektoryzację
np.all
:Daje zgodnie z oczekiwaniami:
źródło
Jednym ze sposobów jest podzielenie wartości kolumn na listy za pomocą
str.split
i sprawdzenie, czyset(letters)
jest to jednasubset
z uzyskanych list:Reper:
źródło
TypeError: unhashable type: 'set'
kiedy uruchamiam twój kod? uruchomiłem go na dostarczonej ramce aboe1.0.3
i python to3.7
prawdopodobnie tylko jaMożesz użyć
np.intersect1d
:źródło
To także rozwiązuje:
źródło
Użyj set.issubset :
źródło
IIUC
explode
i filtr boolowskiChodzi o to, aby utworzyć pojedynczą serię, a następnie możemy pogrupować według indeksu liczbę prawdziwych wystąpień na liście za pomocą sumy skumulowanej
źródło
wynik:
timeit
wynik
źródło