Как последовательно находить и заменять значения четных элементов - PullRequest
2 голосов
/ 05 мая 2020

У меня есть следующий список:

list_1 = [12, 15, 18, 21, 6, 9, 7, 21, 38, 62, 65, 68, 81, 21, 25, 96, 101, 8, 11]

Есть последовательности элементов, чьи значения расстояния равны. В этом списке это расстояние составляет 3, например 12, 15, 18, 21.

Как я могу заменить значение элементов с четными позициями для каждой из этих последовательностей / подсписок новым значением, скажем - 1. Результат будет:

list_2 = [12, -1, 18, -1, 6, -1, 7, 21, 38, 62, -1, 68, 81, 21, 25, 96, 101, 8, -1]

Ответы [ 2 ]

3 голосов
/ 05 мая 2020

Используйте diff()

s = pd.Series(list_1)
s.loc[(s.diff() == 3) & (s.index % 2 == 1)] = -1

, что дает

[12, -1, 18, -1, 6, -1, 7, 21, 38, 62, 65, -1, 81, 21, 25, 96, 101, 8, 11]

Теперь, если вам нужны четные позиции, относящиеся к каждая этих последовательностей независимо, используйте groupby и cumcount

s.loc[s.groupby(s.diff().ne(3).cumsum()).cumcount() % 2 == 1] = -1

, что дает

[12, -1, 18, -1, 6, -1, 7, 21, 38, 62, -1, 68, 81, 21, 25, 96, 101, 8, -1]

Разница будет последней -1 в вашем примере. Первое решение предполагает, что 11 не следует заменять, потому что он находится в неравном положении в вашем list_1. Второе решение предполагает, что его следует заменить, потому что он находится в четной позиции в подсписке [8, 11].

1 голос
/ 05 мая 2020

Для подхода, основанного на numpy, мы могли бы использовать np.diff, чтобы найти первые различия в массиве и проверить, являются ли элементы четными, взяв 2 по модулю np.arange. Затем мы можем связать оба условия с помощью bitwise AND и присвоить срез обратно к a:

a = np.array([12, 15, 18, 21, 6, 9, 7, 21, 38, 62, 65, 68, 81, 21, 25, 96, 101, 8, 11])

m = (np.diff(a)==3) & (np.arange(1,len(a))%2==1)
a[1:] = np.where(m, -1, a[1:])

print(a)
array([ 12,  -1,  18,  -1,   6,  -1,   7,  21,  38,  62,  65,  -1,  81,
        21,  25,  96, 101,   8,  11])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...