Trong trường hợp của tôi, tôi có một Chuỗi gấu trúc trong đó các giá trị là các bộ ký tự :
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)
Do đó, tôi có thể sử dụng lập chỉ mục để lọc chuỗi, nhưng để tạo chỉ mục tôi cần apply
. Điều kiện của tôi là "tìm tất cả các bộ giá trị có đúng một 'H'".
series_of_tuples[series_of_tuples.apply(lambda x: x.count('H')==1)]
Tôi thừa nhận nó không phải là "chainable" , (nghĩa là tôi lặp lại series_of_tuples
hai lần; bạn phải lưu trữ bất kỳ chuỗi tạm thời nào vào một biến để bạn có thể gọi apply (...) trên đó).
Cũng có thể có các phương thức khác (ngoài ra .apply(...)
) có thể hoạt động theo từng phần tử để tạo ra chỉ số Boolean.
Nhiều câu trả lời khác (bao gồm cả câu trả lời được chấp nhận) sử dụng các chức năng có thể phân tích được như:
.compress()
.where()
.loc[]
[]
Chúng chấp nhận các giá trị có thể gọi (lambdas) được áp dụng cho Chuỗi , không áp dụng cho các giá trị riêng lẻ trong chuỗi đó!
Do đó, loạt bộ giá trị của tôi hoạt động kỳ lạ khi tôi cố gắng sử dụng điều kiện / callable / lambda ở trên của mình, với bất kỳ hàm nào có thể điều khiển được, như .loc[]
:
series_of_tuples.loc[lambda x: x.count('H')==1]
Tạo ra lỗi:
KeyError: 'Cấp H phải giống với tên (Không có)'
Tôi đã rất bối rối, nhưng có vẻ như nó đang sử dụng hàm Series.countseries_of_tuples.count(...)
, không phải là những gì tôi muốn.
Tôi thừa nhận rằng một cấu trúc dữ liệu thay thế có thể tốt hơn:
- Một kiểu dữ liệu Danh mục?
- Khung dữ liệu (mỗi phần tử của tuple trở thành một cột)
- Một loạt các chuỗi (chỉ cần nối các bộ giá trị với nhau):
Điều này tạo ra một chuỗi các chuỗi (tức là bằng cách nối bộ tuple; nối các ký tự trong bộ vào một chuỗi duy nhất)
series_of_tuples.apply(''.join)
Vì vậy, tôi sau đó có thể sử dụng thể kết nốiSeries.str.count
series_of_tuples.apply(''.join).str.count('H')==1