У моєму випадку у мене була серія panda, де значеннями є кортежі символів :
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)
Тому я міг використовувати індексацію для фільтрування серії, але для створення індексу, який мені потрібен apply
. Мій умова - "знайти всі кортежі, які мають рівно одне" H "".
series_of_tuples[series_of_tuples.apply(lambda x: x.count('H')==1)]
Я визнаю, що це не "придатне для створення" (тобто зауважте, я повторюю series_of_tuples
двічі; ви повинні зберігати будь-які тимчасові ряди у змінних, щоб ви могли викликати застосувати (...) на них).
Можуть бути й інші методи (крім .apply(...)
), які можуть діяти поелементно, щоб отримати булев індекс.
Багато інших відповідей (включаючи прийняту відповідь) з використанням таких функцій, як:
.compress()
.where()
.loc[]
[]
Вони приймають виклики (лямбди), які застосовуються до Серії , а не до окремих значень у цій серії!
Тому моя серія кортежів поводилася дивно, коли я намагався використати мій вищезгаданий умова / викликається / лямбда, з будь-якою з функцій, які можна застосувати, наприклад .loc[]
:
series_of_tuples.loc[lambda x: x.count('H')==1]
Видає помилку:
KeyError: 'Рівень H повинен збігатися з ім'ям (немає)
Я був дуже збентежений, але це , здається, використовує Series.count series_of_tuples.count(...)
функцію , яка не те , що я хотів.
Я визнаю, що альтернативна структура даних може бути кращою:
- Тип даних категорії?
- Кадр даних (кожен елемент кортежу стає стовпцем)
- Серія рядків (просто об'єднайте кортежі разом):
Це створює серію рядків (тобто шляхом об'єднання кортежу; об'єднання символів у кортежі в одному рядку)
series_of_tuples.apply(''.join)
Тож я можу тоді скористатися ланцюжкомSeries.str.count
series_of_tuples.apply(''.join).str.count('H')==1