Как я могу оптимизировать это присвоение значения, используя pandas - PullRequest
0 голосов
/ 04 марта 2020

У меня есть DataFrame в Pandas со столбцом 'register', который может быть либо 0, либо некоторым положительным числом, я хочу создать новый столбец 'Working', равный 1, если эта строка в 'register' или любой из 7 предыдущих не 0. Я пытался их перебирать, но поскольку это большой DataFrame, он работает очень медленно. Это мой код:

df['working'] = 0
for i in range(len(df['register'])):
    if df['register'][i] != 0 or \
        (i>1 and df['register'][i-1] != 0) or\
        (i>2 and df['register'][i-2] != 0) or\
        (i>3 and df['register'][i-3] != 0) or\
        (i>4 and df['register'][i-4] != 0) or\
        (i>5 and df['register'][i-5] != 0) or\
        (i>6 and df['register'][i-6] != 0):
        df['working'][i] = 1
    else:
        df['working'][i] = 0

Я также пытался использовать this и выглядел так:

df['working']=df['register'].apply(lambda x: 1 if x!=0 or x.shift(1)!=0 or x.shift(2)!=0 or x.shift(3)!=0 or x.shift(4)!=0 or x.shift(5)!=0 or x.shift(6)!=0 else 0)

Но я получил:

AttributeError: у объекта 'float' нет атрибута 'shift'

Есть ли лучший способ сделать это, используя pandas?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Попробуйте:

conditional_value= [1]
condition = [df['register'].rolling(8).sum()>0]
df['working'] = np.select(condition, working, default=0)

Вы можете указать дополнительные условия и соответствующие значения:

condition = [condition 1, condition 2, ......, condition n]
conditional_values = [value 1, value 2, ........, value n]
1 голос
/ 04 марта 2020

Это должно сработать, вы можете передать min_periods=1 на rolling

df['working'] = df['register'].ne(0).rolling(6).sum().gt(0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...