Как чистить / изменять значения Серии между двумя различными значениями в соответствии с правилами, не меняя отметки? - PullRequest
0 голосов
/ 26 сентября 2018
import pandas as pd
import numpy as np
nan = np.NaN
data = [['a1',0,'Bottom_Class'],
        ['a1',0,nan],
        ['a1',1,nan],
        ['a1',1,nan],
        ['a1',1,nan],
        ['a1',1,'Top_Class'],
        ['a1',0,'Bottom_Class'],
        ['a1',0,'Top_Class'],
        ['a2',1,nan],
        ['a2',1,nan],
        ['a2',1,'Bottom_Class'],
        ['a2',0,nan],
        ['a2',0,'Bottom_Class'],
        ['a1',0,'Top_Class'],
        ['a2',1,nan],
        ['a1',1,'Top_Class'],
        ['a2',1,nan],
        ['a2',1,nan],
        ['a2',1,nan],
        ['a2',0,'Bottom_Class']]

df = pd.DataFrame(data,columns=['Id','State','Class'])
print(df)
    Id  State         Class
0   a1      0  Bottom_Class
1   a1      0           NaN
2   a1      1           NaN
3   a1      1           NaN
4   a1      1           NaN
5   a1      1     Top_Class
6   a1      0  Bottom_Class
7   a1      0     Top_Class
8   a2      1           NaN
9   a2      1           NaN
10  a2      1  Bottom_Class
11  a2      0           NaN
12  a2      0  Bottom_Class
13  a1      0     Top_Class
14  a2      1           NaN
15  a1      1     Top_Class
16  a2      1           NaN
17  a2      1           NaN
18  a2      1           NaN
19  a2      0  Bottom_Class

Итак, это данные некоторых цен на фондовом рынке, но я изменяю их так, чтобы их было легче понять.

Просто чтобы сосредоточиться на df.Class:

Я думаю, чтоустановите: Bottom_Class в качестве начальной точки и Top_Class в качестве конечной точки.И наоборот.

И значение после (не включая себя) Top_Class будет установлено на 0 , пока не встретится Bottom_Class

и значение после (не включая себя) Bottom_Classбудет установлен на 1 , пока не встретится с Top_Class.

Я хочу изменить серию следующим образом:

Class
Bottom_Class
1
1
1
1
Top_Class
Bottom_Class
Top_Class
0
0
Bottom_Class
1
Bottom_Class
Top_Class
0
Top_Class
0
0
0
Bottom_Class

1 Ответ

0 голосов
/ 26 сентября 2018

Вы можете использовать np.where и использовать fillna для заполнения только NaN значений

df.Class.fillna(pd.Series(np.where(df.Class.ffill() == 'Bottom_Class',1,0)))

# Output:

0     Bottom_Class
1                1
2                1
3                1
4                1
5        Top_Class
6     Bottom_Class
7        Top_Class
8                0
9                0
10    Bottom_Class
11               1
12    Bottom_Class
13       Top_Class
14               0
15       Top_Class
16               0
17               0
18               0
19    Bottom_Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...