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

Мой упрощенный фрейм данных выглядит следующим образом:

df = pd.DataFrame()
df['A'] = ('IGNORE','IGNORE','IGNORE','YES','IGNORE','YES','YES','YES','IGNORE','IGNORE','IGNORE','YES','IGNORE','IGNORE','IGNORE','IGNORE','IGNORE','IGNORE','IGNORE','IGNORE','IGNORE', 'NO','IGNORE','IGNORE','IGNORE','IGNORE')

Мне нужно перевернуть фрейм данных (что, я знаю, я могу сделать с помощью df = df [:: - 1]), а затем сделать столбец B следующим образом.

  • если происходит «ДА», то последующие строки приводят к «ХОРОШЕМУ», пока «ДА» или «НЕТ» не появятся снова, и наоборот, если произойдет «НЕТ», за исключением того, что «ПЛОХОЙ» заменит «ХОРОШО»

Желание выводится следующим образом:

df['B'] = ('GOOD','GOOD','GOOD','YES','IGNORE','YES','YES','YES','GOOD','GOOD','GOOD','YES','BAD','BAD','BAD','BAD','BAD','BAD','BAD','BAD','BAD', 'NO','IGNORE','IGNORE','IGNORE','IGNORE')

1 Ответ

1 голос
/ 26 июня 2019

Идея состоит в том, чтобы использовать Series.map dy dictianry сначала с заполнением пропущенных значений и заменить последнюю группу на fillna на Series, которая используется для замены IGNORE последовательных значений - 2 или более:

s = df['A'].map({'IGNORE': np.nan, 'YES':'GOOD', 'NO':'BAD'}).bfill().fillna(df['A'])
m1 = df.groupby(df['A'].ne(df['A'].shift()).cumsum())['A'].transform('size').ne(1)
m2 = df['A'].eq('IGNORE')

df['C'] = np.where(m1 & m2, s, df['A'])
print(df)
         A       B       C
0   IGNORE    GOOD    GOOD
1   IGNORE    GOOD    GOOD
2   IGNORE    GOOD    GOOD
3      YES     YES     YES
4   IGNORE  IGNORE  IGNORE
5      YES     YES     YES
6      YES     YES     YES
7      YES     YES     YES
8   IGNORE    GOOD    GOOD
9   IGNORE    GOOD    GOOD
10  IGNORE    GOOD    GOOD
11     YES     YES     YES
12  IGNORE     BAD     BAD
13  IGNORE     BAD     BAD
14  IGNORE     BAD     BAD
15  IGNORE     BAD     BAD
16  IGNORE     BAD     BAD
17  IGNORE     BAD     BAD
18  IGNORE     BAD     BAD
19  IGNORE     BAD     BAD
20  IGNORE     BAD     BAD
21      NO      NO      NO
22  IGNORE  IGNORE  IGNORE
23  IGNORE  IGNORE  IGNORE
24  IGNORE  IGNORE  IGNORE
25  IGNORE  IGNORE  IGNORE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...