Saya punya df seperti ini:
frame = pd.DataFrame({'a' : ['a,b,c', 'a,c,f', 'b,d,f','a,z,c']})
Dan daftar barang:
letters = ['a','c']
Tujuan saya adalah mendapatkan semua baris dari frame
yang berisi setidaknya 2 elemen diletters
Saya datang dengan solusi ini:
for i in letters:
subframe = frame[frame['a'].str.contains(i)]
Ini memberi saya apa yang saya inginkan, tetapi itu mungkin bukan solusi terbaik dalam hal skalabilitas. Apakah ada solusi 'vectorised'? Terima kasih
Jawaban:
Saya akan membuat daftar Seri, dan kemudian menerapkan vektor
np.all
:Ini memberi seperti yang diharapkan:
sumber
Salah satu caranya adalah dengan membagi nilai kolom menjadi daftar menggunakan
str.split
, dan memeriksa apakahset(letters)
adalahsubset
dari daftar yang diperoleh:Benchmark:
sumber
TypeError: unhashable type: 'set'
ketika saya menjalankan kode Anda? menjalankannya pada frame aboe yang disediakan1.0.3
dan python3.7
mungkin hanya sayaAnda bisa menggunakan
np.intersect1d
:sumber
Ini juga menyelesaikannya:
sumber
Gunakan set.issubset :
sumber
IIUC,
explode
dan filter booleanidenya adalah untuk membuat satu seri maka kita dapat mengelompokkan berdasarkan indeks menghitung kejadian sebenarnya dari daftar Anda menggunakan jumlah kumulatif
sumber
keluaran:
timeit
keluaran
sumber