Dalam kasus saya, saya memiliki Seri panda di mana nilainya adalah tupel karakter :
Out[67]
0 (H, H, H, H)
1 (H, H, H, T)
2 (H, H, T, H)
3 (H, H, T, T)
4 (H, T, H, H)
Oleh karena itu saya dapat menggunakan pengindeksan untuk memfilter rangkaian, tetapi untuk membuat indeks yang saya butuhkan apply. Kondisi saya adalah "temukan semua tupel yang memiliki tepat satu 'H'".
series_of_tuples[series_of_tuples.apply(lambda x: x.count('H')==1)]
Saya akui itu tidak "dapat dirantai" , (yaitu pemberitahuan yang saya ulangiseries_of_tuples dua kali; Anda harus menyimpan rangkaian sementara ke dalam variabel sehingga Anda dapat memanggil apply (...) di atasnya).
Mungkin juga ada metode lain (selain .apply(...)) yang dapat beroperasi secara elementwise untuk menghasilkan indeks Boolean.
Banyak jawaban lain (termasuk jawaban yang diterima) menggunakan fungsi yang dapat dirantai seperti:
.compress()
.where()
.loc[]
[]
Ini menerima callables (lambdas) yang diterapkan pada Seri , tidak individu nilai-nilai dalam seri mereka!
Oleh karena itu, Seri tupel saya berperilaku aneh ketika saya mencoba menggunakan kondisi / callable / lambda saya di atas, dengan salah satu fungsi yang dapat dirantai, seperti .loc[]:
series_of_tuples.loc[lambda x: x.count('H')==1]
Menghasilkan kesalahan:
KeyError: 'Level H harus sama dengan nama (Tidak Ada)'
Saya sangat bingung, tetapi tampaknya menggunakan fungsi Series.countseries_of_tuples.count(...) , yang bukan itu yang saya inginkan.
Saya akui bahwa struktur data alternatif mungkin lebih baik:
- Jenis data kategori?
- A Dataframe (setiap elemen tupel menjadi kolom)
- Serangkaian string (hanya menggabungkan tupel menjadi satu):
Ini menciptakan serangkaian string (yaitu dengan menggabungkan tupel; menggabungkan karakter dalam tupel pada satu string)
series_of_tuples.apply(''.join)
Jadi saya kemudian bisa menggunakan rantaiSeries.str.count
series_of_tuples.apply(''.join).str.count('H')==1