У меня есть dataframe, который выглядит, как этотпанды - Выбор пары последовательных строк, соответствующих критериям
>>> a_df
state
1 A
2 B
3 A
4 B
5 C
Что я хотел бы сделать, это вернуть все последовательные строки соответствие определенной последовательности. Например, если эта последовательность равна ['A', 'B']
, тогда должны быть возвращены строки, состояние которых A
, за которым следует сразу B
. В приведенном выше примере:
>>> cons_criteria(a_df, ['A', 'B'])
state
1 A
2 B
3 A
4 B
Или, если выбранный массив ['A', 'B', 'C']
, то выход должен быть
>>> cons_criteria(a_df, ['A', 'B', 'C'])
state
3 A
4 B
5 C
Я решил сделать это путем сохранения текущего состояния, а также следующее состояние:
>>> df2 = a_df.copy()
>>> df2['state_0'] = a_df['state']
>>> df2['state_1'] = a_df['state'].shift(-1)
Теперь я могу соответствовать по state_0
и state_1
. Но это возвращает только самый первый вход:
>>> df2[(df2['state_0'] == 'A') & (df2['state_1'] == 'B')]
state
1 A
3 A
Как исправить логику здесь, так что все последовательные строки возвращаются? Есть ли лучший способ приблизиться к этому в пандах?
Это хороший подход, но собирается Numpy и делает его немного трудно читать (я не думаю, что я полностью следовать, так как я не такой опытный в NumPy). Я понял, что строка '(df2 ['state_0'] == 'A') & (df2 ['state_1'] == 'B')' возвращает двоичную серию для всех исходных точек. Так что, если я могу получить индексы, для которых эта серия является «Истиной», добавьте 1 к этим числам, чтобы получить следующие строки, а затем вытащить их объединение из 'a_df', я бы получил правильный ответ. Любые идеи, как преобразовать двоичную серию в просто индексы? – user1496984
@ user1496984 Да! Вместо этого вместо 's.iloc [slc]' return 's.index [slc]'. – piRSquared
Ах, но это не сработает, если индекс является строкой (согласно другому ответу). Как я могу вместо этого получить «целое местоположение» для каждого элемента «True» в серии? Я предполагаю, что тогда мне придется использовать '.iloc' для выбора конечных элементов. – user1496984