Как получить строки, когда определенное значение столбца является непрерывным для определенного количества строк

#python-3.x #pandas #numpy #pandas-groupby

#python-3.x #панды #numpy #pandas-groupby

Вопрос:

Я хочу извлекать строки, когда значение столбца x остается неизменным более чем для пяти последовательных строк.

      x  x2
0    5   5
1    4   5
2   10   6
3   10   5
4   10   6
5   10  78
6   10  89
7   10  78
8   10  98
9   10   8
10  10  56
11  60  45
12  10  65

Desired_output:

    x  x2
0  10   6
1  10   5
2  10   6
3  10  78
4  10  89
5  10  78
6  10  98
7  10   8
8  10  56
 

Ответ №1:

Вы можете использовать .shift .cumsum для идентификации блоков последовательных строк, где x значение столбца остается неизменным, затем группировать фрейм данных по этим блокам и transform использовать count для идентификации групп, которые имеют больше 5 последовательных одинаковых значений в x :

 b = df['x'].ne(df['x'].shift()).cumsum()
df_out = df[df['x'].groupby(b).transform('count').gt(5)]
 

Подробные сведения:

 >>> b
0     1
1     2
2     3
3     3
4     3
5     3
6     3
7     3
8     3
9     3
10    3
11    4
12    5
Name: x, dtype: int64

>>> df_out
     x  x2
2   10   6
3   10   5
4   10   6
5   10  78
6   10  89
7   10  78
8   10  98
9   10   8
10  10  56
 

Комментарии:

1. я хочу получать последовательные строки только тогда, когда значение x равно 10, если другие значения имеют последовательные строки, которые мне не нужны

2. В этом случае вы можете использовать df[df['x'].groupby(b).transform('count').gt(5) amp; df['x'].eq(10)]

Ответ №2:

вы можете использовать shift для сравнения следующей строки, а затем взять совокупную сумму для сравнения, если повторение больше 5, затем сгруппировать x и преобразовать any , а затем замаскировать условием, чтобы отменить выбор строк, где условие не соответствует.

 c = df['x'].eq(df['x'].shift())
out = df[c.cumsum().gt(5).groupby(df['x']).transform('any') amp; (c|c.shift(-1))]
 

 print(out)

     x  x2
2   10   6
3   10   5
4   10   6
5   10  78
6   10  89
7   10  78
8   10  98
9   10   8
10  10  56