Преобразование последовательных истин в ложный питон - PullRequest
0 голосов
/ 28 мая 2019

По сути, я хочу преобразовать последовательные дубликаты Истин в Ложь, как следует из названия.

Например, скажем, у меня есть массив 0 и 1 с

x = pd.Series([1,0,0,1,1])

должно стать:

y = pd.Series([0,0,0,0,1])
# where the 1st element of x becomes 0 since its not a consecutive
# and the 4th element becomes 0 because its the first instance of the consecutive duplicate
# And everything else should remain the same.

Это также может относиться к последовательностям более двух, скажем, у меня гораздо более длинный массив: например.

x = pd.Series([1,0,0,1,1,1,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1])

становится;

y = pd.Series([0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1])

Сообщения, которые я искал, в основном либо удаляют последовательные дубликаты, но не сохраняют первоначальную длину. В этом случае он должен сохранить исходную длину.

Это что-то вроде следующего кода:

for i in range(len(x)):
    if x[i] == x[i+1]:
        x[i] = True
    else:
       x[i] = False

но это дает мне бесконечный бег. И не вмещает в себя более двух последовательных.

Ответы [ 2 ]

2 голосов
/ 28 мая 2019

Ванильный питон:

x = [1,0,0,1,1,1,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1]
counter = 0
for i, e in enumerate(x):
    if not e:
        counter = 0
        continue
    if not counter or (i < len(x) - 1 and x[i+1]):
        counter += 1
        x[i] = 0
print(x)

Отпечатки:

[0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1]
2 голосов
/ 28 мая 2019

Решение Pandas - создайте Series, затем последовательные группы по shift и cumsum и отфильтруйте последние 1 значения в дубликатах по Series.duplicated:

s = pd.Series(x)
g = s.ne(s.shift()).cumsum()
s1 = (~g.duplicated(keep='last') & g.duplicated(keep=False) & s.eq(1)).astype(int)

print (s1.tolist())
[0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1]

EDIT:

Для нескольких столбцов используйте функцию:

x = pd.Series([1,0,0,1,1,1,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1])
df = pd.DataFrame({'a':x, 'b':x})

def f(s):
    g = s.ne(s.shift()).cumsum()
    return (~g.duplicated(keep='last') & g.duplicated(keep=False) & s.eq(1)).astype(int)

df = df.apply(f)
print (df)
    a  b
0   0  0
1   0  0
2   0  0
3   0  0
4   0  0
5   1  1
6   0  0
7   0  0
8   1  1
9   0  0
10  0  0
11  0  0
12  0  0
13  1  1
14  0  0
15  0  0
16  0  0
17  0  0
18  0  0
19  0  0
20  1  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...