Как заменить значения столбца на основе предыдущего значения условием и выбрать строки из кадра данных - PullRequest
1 голос
/ 22 марта 2019

У меня есть датафрейм с двумя столбцами X1 и X2

первым делом: В X2 у меня есть значения 0 и 1, если в X2 значение равно 1, когда это изменение с 1 на ноль, то в следующих 20 строках должно быть 1, а не ноль.

например:

X2=(0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)

desired X2=(0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)

Второе: , если X1=0 и X2=1, то выбирать строки в кадре данных до тех пор, пока значение X2 не останется 1 Я попробовал этот кусок кода, но он выбирает только одну строку.

df1=df[(df['X1'] == 0) & (df['X2'] ==1)]

Ответы [ 3 ]

1 голос
/ 22 марта 2019

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

#first prog
index = 0
while index < df.shape[0]:
    if index + 1 < df.shape[0] and df['X2'][index] == 1 and df['X2'][index + 1] == 0:
        df.loc[index +1: index + 20,'X2'] = 1            #set 1 to next 20 rows
        break;
    index = index + 1 

print(df)

#second prog assuming you have a column X1/X2
df['select'] = False
for index, row in df.iterrows():
    if index > 0 and df['select'][index - 1] == True and row.X2 == 1:
        df.loc[index, 'select'] = True
    if row.X1 == 0 and row.X2 == 1:
        df.loc[index, 'select'] = True

df = df[df['select'] == True].drop('select', axis=1) 

print(df)
1 голос
/ 22 марта 2019

Отредактировано, чтобы включить обе части:

# First Thing:
df['X2'] = df['X2'].replace({0: np.nan}).ffill(limit=20).fillna(0)

# Second Thing:
df.loc[(df['X1'] == 0) & (df['X2'] == 1), 'new X2'] = 1
df.loc[(df['X2'] == 0), 'new X2'] = 0
df['new X2'] = df['new X2'].ffill()
df.loc[df['new X2'] == 1] # Selected Rows
0 голосов
/ 22 марта 2019

Вот решение для «Первой вещи» с использованием numpy.

import numpy as np

locs =np.where(df['X2'].diff() == -1)[0]
for loc in locs:
    df.loc[slice(loc, loc+20), 'X2'] = 1
...