Заменить строковое значение предыдущим строковым значением на основе условий - Панды - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь заменить значение в текущей строке на основе предыдущей строки, если выполнены определенные условия.

Условия:

Текущийстрока 0

Предыдущая строка: C

Внутри группы (предпочтительно, но, вероятно, будет работать без нее)

Пример кадра данныхпохож на мой:

ID  Week value
 4    1     W
 4    2     C
 4    3     0
 4    4     0
24    1     W
24    2     W
24    3     0
24    4     A

Пример того, как мне нужно, чтобы он выглядел:

ID  Week value
 4    1     W
 4    2     C
 4    3     C
 4    4     C
24    1     W
24    2     W
24    3     0
24    4     A

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

  1. условная замена на основе предыдущего значения в том же столбце Python DataFrame Python
  2. условное изменение ряда панд с предыдущим значением строки

Код для построения кадра данных, аналогичного моему

import pandas as pd

df = pd.DataFrame({'ID': {0:'4', 1:'4', 2:'4', 3:'4', 4:'24', 5:'24', 6:'24', 7:'24'}, 'Week': {0:'1', 1:'2', 2:'3', 3:'4', 4: '1', 5:'2', 6:'3', 7:'4'},  'value': {0:'W', 1:'C', 2:'0', 3:'0', 4: 'W', 5:'W', 6:'0', 7:'A'} })
df[['ID', 'Week']] = df[['ID', 'Week']].astype('int')

Плохо сработала попытка решить проблему (выдает ошибки)

for i in range(1, len(df)):
    if df.value[i] == '0' and df.value[i-1] == 'C':
         df.value[i] = 'C'
     else:
         df.value[i] = df.value[i]

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Обычно я бы использовал np.where, чтобы применить условное выражение к столбцу.Однако, учитывая функцию .shift(), это не работает, не бросая ее в цикл for.Быстрый метод использует .replace():

for row in range(0,len(df)):
    df['value'] = df['value'].replace('0',df['value'].shift(1))

Если вы хотите сохранить условия, вы все равно можете использовать np.where аналогичным образом.

for row in range(0,len(df)):
    df['value'] = np.where((df['value'] == '0') & (df['value'].shift(1) == 'C'), 'C', df['value'])
1 голос
/ 20 сентября 2019

Не легко обобщить в других ситуациях, но для вашего конкретного случая вы можете сделать:

is_0 = df['value'] == '0'
is_C_block = df['value'].replace('0', pd.np.nan).fillna(method='ffill') == 'C'

df.loc[is_0 & is_C_block, 'value'] = 'C'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...