Pandas-Update значения предыдущей и следующей строк на основе текущей группы значений строк по идентификатору - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть dataframe, df и я хочу изменить значение в столбце «Status» для каждого «Id»

Правило таково: если «Status» == «High», обновите строки до «Before»Еще «После»

Фрейм данных, df:

     Id     Status    
0    1      Low
1    1      Low
2    1      High
3    1      Low
4    2      Low
5    2      Low
6    2      High
7    2      Low
8    3      Low
9    3      Low
10   3      High
11   3      Low
12   3      High
13   3      Low

Мой ожидаемый df:

     Id     Status
 0   1      Before
 1   1      Before
 2   1      High
 3   1      After
 4   2      Before
 5   2      Before
 6   2      High
 7   2      After
 8   3      Before
 9   3      Before
10   3      High
11   3      After
12   3      High
13   3      After 

Это мой код до сих пор, (я не добавилПравило еще изменить на «После» еще)

df.loc[df.groupby(['Id'])['Status'] == "High", df['Status'].shift(1)] = 'Before'

Я получил ошибку:

ValueError: cannot index with vector containing NA / NaN values

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Вы можете использовать функцию карты:

df['Status'] = df['Status'].map({'High': 'After', 'Low': 'Before'})
0 голосов
/ 13 февраля 2019

Используйте numpy.select для установки после последней High для групп до After и всех значений без High до Before:

m1 = df['Status'].eq('High')
m2 = m1.groupby(df['Id']).cumsum() == 0

df['Status1'] = np.select([m1, m2], ['High', 'Before'], default='After') 
print (df)
    Id Status Status1
0    1    Low  Before
1    1    Low  Before
2    1   High    High
3    1    Low   After
4    2    Low  Before
5    2    Low  Before
6    2   High    High
7    2    Low   After
8    3    Low  Before
9    3    Low  Before
10   3   High    High
11   3    Low   After
12   3   High    High
13   3    Low   After
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...