Панды заполняют нули длины значениями - PullRequest
0 голосов
/ 10 июля 2019

У меня есть df, скажем

import pandas as pd
col = 'one'
d = {col : pd.Series([1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1])} 
df = pd.DataFrame(d)
df

df = 1,1,1,1,0,1,1,0,0,1,1

Теперь я хочу заменить все последовательные значения длины x (здесь x = 1) значением v (здесь v = 1).Так что мой новый df выглядит следующим образом

1,1,1,1, <1>, 1, 1, 0, 0, 1, 1

из

1,1,1,1, <0>, 1, 1, 0, 0, 1, 1

До сих пор мой подход состоит в построении последовательныхгруппам

def build_consecutive_groups(df: pd.DataFrame, col, newcol_appendix='_same'):
    df[col + newcol_appendix] = (df[col] != df[col].shift()).cumsum()
    return df.groupby(col + newcol_appendix, as_index=False)

для другого столбца 'one_same'

1,1,1,1,2,3,3,4,4,5,5

, что дает мне подгруппы.Теперь я могу использовать подгруппу apply, чтобы получить форму и проверить, где shape [0] равен 1, а значение равно 0, чтобы идентифицировать ячейку, которую я хочу заменить на 1. Затем создайте индексную серию, которая идентифицирует эти значения, и установитев последнем шаге к 1.

Но это выглядит очень сложно, и я думаю, что должен быть лучший способ, например, с использованием функции прокатки.

1 Ответ

3 голосов
/ 10 июля 2019

Вы можете сделать с diff, затем cumsum и с помощью groupby + transform для групп заменить значение

x=1
s=df.one.diff().ne(0).cumsum()
df.loc[s.groupby(s).transform('count')==x,'one']='v'
df
Out[193]: 
   one
0    1
1    1
2    1
3    1
4    v
5    1
6    1
7    0
8    0
9    1
10   1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...