Найти все индексы / экземпляры всех повторяющихся шаблонов в столбцах и строках панд данных - PullRequest
1 голос
/ 02 октября 2019

Предположим, у меня есть простой фрейм данных pandas df:

     | name      | car   |
|----|-----------|-------|
| 0  | 'bob'     | 'b'   |
| 1  | 'bob'     | 'c'   |
| 2  | 'fox'     | 'b'   |
| 3  | 'fox'     | 'c'   |
| 4  | 'cox'     | 'b'   |
| 5  | 'cox'     | 'c'   |
| 6  | 'jo'      | 'b'   |
| 7  | 'jo'      | 'c'   |
| 8  | 'bob'     | 'b'   |
| 9  | 'bob'     | 'c'   |
| 10 | 'bob'     | 'b'   |
| 11 | 'bob'     | 'c'   |
| 12 | 'rob'     | 'b'   |
| 13 | 'rob'     | 'c'   |

Я хотел бы найти индексы строк определенного шаблона, охватывающего оба столбца. В моем реальном приложении вышеупомянутый фрейм данных имеет несколько тысяч строк, а у меня есть несколько тысяч фреймов данных, поэтому производительность не важна. Скажем, интересующий меня паттерн:

| 'bob'     | 'b'   |
| 'bob'     | 'c'   |

Следовательно, используя приведенный выше пример, мой желаемый результат будет:

out_idx = [0,1,8,9,10,11]

Обычно, конечно, для одного паттернаможно было бы сделать что-то вроде df.loc[(df.name == 'bob') & (df.car == 'b')], но я не уверен, как это сделать, когда я ищу конкретный и многомерный шаблон по нескольким столбцам. Т.е. я ищу (и мне довольно следующее не правильно): df.loc[(df.name == 'bob') & (df.car == 'b') & (df.car == 'c')].

Помощь высоко ценится. Thx!

1 Ответ

2 голосов
/ 02 октября 2019

Используйте boolean indexing с Series.isin вместо второго и третьего условий:

df1 = df[(df.name == 'bob') & df.car.isin(['b','c'])]
print (df1)
   name car
0   bob   b
1   bob   c
8   bob   b
9   bob   c
10  bob   b
11  bob   c

Если нужны значения индекса:

out_idx = df.index[(df.name == 'bob') & df.car.isin(['b','c'])]

Или:

out_idx = df[(df.name == 'bob') & df.car.isin(['b','c'])].index

Ваше решение возможно с | (поразрядным ИЛИ) вместо второго &, а также добавлен один ():

df1 = df[(df.name == 'bob') & ((df.car == 'b') | (df.car == 'c'))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...