Выберите количество строк в кадре данных после допустимого условия - PullRequest
0 голосов
/ 08 апреля 2020

Я хотел бы выбрать указанное количество строк после проверки условия:

  • Вот мой фрейм данных:

enter image description here

  • Я хотел бы выбрать три столбца после того, как запись равна 1, , поэтому для первого вхождения Я бы получил что-то подобное:

enter image description here

  • Я не знаю, что является наиболее подходящим выходом, если я хочу изучать каждый случай, может быть, групповым?

1 Ответ

3 голосов
/ 08 апреля 2020

Сначала удалите 0 строк перед первым 1:

df = df[df['entry'].eq(1).cumsum().ne(0)]

df = df.groupby(df['entry'].cumsum()).head(4)
    Timestamp  entry
1        11.2      1
2        11.3      0
3        11.4      0
4        11.5      0
7        11.8      1
8        11.9      0
9        12.0      0
10       12.1      0

Подробности и пояснения :

Для общего решения для удаления всех значений перед первым совпадением используется сравнение по Series.eq, затем кумулятивная сумма по Series.cumsum и сравнение по Series.ne - поэтому отфильтруйте все значения 0 после cumsum операция:

print (df.assign(comp1 = df['entry'].eq(1),
                 cumsum =df['entry'].eq(1).cumsum(),
                 mask = df['entry'].eq(1).cumsum().ne(0)))
    Timestamp  entry  comp1  cumsum   mask
0        11.1      0  False       0  False
1        11.2      1   True       1   True
2        11.3      0  False       1   True
3        11.4      0  False       1   True
4        11.5      0  False       1   True
5        11.6      0  False       1   True
6        11.7      0  False       1   True
7        11.8      1   True       2   True
8        11.9      0  False       2   True
9        12.0      0  False       2   True
10       12.1      0  False       2   True

После фильтрации с помощью boolean indexing создать помощника Series с совокупным значением sum для групп:

print (df['entry'].cumsum())
1     1
2     1
3     1
4     1
5     1
6     1
7     2
8     2
9     2
10    2
Name: entry, dtype: int64

Так что для окончательного решение использовать GroupBy.head со значениями 4 для получения строк с 1 и следующих 3 строк:

df = df.groupby(df['entry'].cumsum()).head(4)
print (df)
    Timestamp  entry
1        11.2      1
2        11.3      0
3        11.4      0
4        11.5      0
7        11.8      1
8        11.9      0
9        12.0      0
10       12.1      0

Для l oop по группам используйте:

for i, g in df.groupby(df['entry'].cumsum()): 
    print (g.head(4))

Если хотите вывести список DataFrame с:

L = [g.head(4) for i, g in df.groupby(df['entry'].cumsum())]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...