#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