Benim durumumda , değerlerin karakter demetleri olduğu bir panda Serim vardı :
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)
Bu nedenle, diziyi filtrelemek için indekslemeyi kullanabilirdim, ancak ihtiyacım olan indeksi oluşturmak için apply
. Koşulum "tam olarak bir 'H' içeren tüm demetleri bul".
series_of_tuples[series_of_tuples.apply(lambda x: x.count('H')==1)]
Bunun "zincirlenebilir" olmadığını kabul ediyorum (yani series_of_tuples
iki kez tekrarladığıma dikkat edin ; herhangi bir geçici seriyi bir değişkene kaydetmeniz gerekir, böylece üzerinde apply (...) çağırabilirsiniz).
Ayrıca söz konusu olabilir diğer yöntemler (yanında .apply(...)
olabilir) bir Boole endeksi üretmek için elementwise çalışırlar.
Zincirleme işlevleri kullanan diğer birçok yanıt (kabul edilen yanıt dahil):
.compress()
.where()
.loc[]
[]
Bunlar , bu serideki bireysel değerlere değil Seriye uygulanan çağrılabilirleri (lambdalar) kabul eder !
Bu nedenle dizilerim, yukarıdaki koşulumu / çağrılabilir / lambda'mı, zincirlenebilir işlevlerden herhangi biriyle kullanmaya çalıştığımda garip davranıyordu, örneğin .loc[]
:
series_of_tuples.loc[lambda x: x.count('H')==1]
Şu hatayı üretir:
KeyError: 'H Düzeyi adla aynı olmalıdır (Yok)'
Kafam çok karışmıştı, ancak Series.count series_of_tuples.count(...)
işlevini kullanıyor gibi görünüyor , ki bu istediğim şey değildi.
Alternatif bir veri yapısının daha iyi olabileceğini kabul ediyorum:
- Kategori veri türü?
- Bir Veri Çerçevesi (başlığın her bir öğesi bir sütun haline gelir)
- Bir dizi dizge (sadece tupleları bir araya getirin):
Bu, bir dizi dize oluşturur (örn. Tuple'ı birleştirerek; demetteki karakterleri tek bir dizede birleştirerek)
series_of_tuples.apply(''.join)
Böylece zincirlenebilir olanı kullanabilirimSeries.str.count
series_of_tuples.apply(''.join).str.count('H')==1