Как заполнить пустое пространство до и после заполненных ячеек? - PullRequest
0 голосов
/ 17 января 2019

Я работаю, чтобы попытаться сгруппировать мои данные по свойству Department, а затем сгруппировать их и заполнить пространство над и под двумя полями, которые заполняются в середине набора данных (Rating и Number).

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

# This won't work on its own because I need to group the data first.    
df = df.mask(df == 0).ffill()

Это то, с чего я начинаю:

| Department   | Range    | Rating       | Number |
|--------------|----------|--------------|--------|
| Admin        | 0 (None) |              |        |
| Admin        | 01 to 3  |              |        |
| Admin        | 01 to 3  |              |        |
| Admin        | 01 to 3  |              |        |
| Admin        | 04 to 6  | 2. On Target | 2      |
| Admin        | 04 to 6  | 2. On Target | 2      |
| Admin        | 04 to 6  | 2. On Target | 2      |
| Admin        | 07 to 10 |              |        |
| Admin        | 07 to 10 |              |        |
| Admin        | 07 to 10 |              |        |
| Admin        | 07 to 10 |              |        |
| Distribution | 0 (None) |              |        |
| Distribution | 01 to 3  |              |        |
| Distribution | 01 to 3  |              |        |
| Distribution | 01 to 3  |              |        |
| Distribution | 04 to 6  | 2. On Target | 2      |
| Distribution | 04 to 6  | 2. On Target | 2      |
| Distribution | 04 to 6  | 2. On Target | 2      |
| Distribution | 07 to 10 |              |        |
| Distribution | 07 to 10 |              |        |
| Distribution | 07 to 10 |              |        |
| Distribution | 07 to 10 |              |        |

Это то, что я хочу

| Department   | Range    | Rating       | Number |
|--------------|----------|--------------|--------|
| Admin        | 0 (None) | 1. Too Low   | 1      |
| Admin        | 01 to 3  | 1. Too Low   | 1      |
| Admin        | 01 to 3  | 1. Too Low   | 1      |
| Admin        | 01 to 3  | 1. Too Low   | 1      |
| Admin        | 04 to 6  | 2. On Target | 2      |
| Admin        | 04 to 6  | 2. On Target | 2      |
| Admin        | 04 to 6  | 2. On Target | 2      |
| Admin        | 07 to 10 | 3. Too High  | 3      |
| Admin        | 07 to 10 | 3. Too High  | 3      |
| Admin        | 07 to 10 | 3. Too High  | 3      |
| Admin        | 07 to 10 | 3. Too High  | 3      |
| Distribution | 0 (None) | 1. Too Low   | 1      |
| Distribution | 01 to 3  | 1. Too Low   | 1      |
| Distribution | 01 to 3  | 1. Too Low   | 1      |
| Distribution | 01 to 3  | 1. Too Low   | 1      |
| Distribution | 04 to 6  | 2. On Target | 2      |
| Distribution | 04 to 6  | 2. On Target | 2      |
| Distribution | 04 to 6  | 2. On Target | 2      |
| Distribution | 07 to 10 | 3. Too High  | 3      |
| Distribution | 07 to 10 | 3. Too High  | 3      |
| Distribution | 07 to 10 | 3. Too High  | 3      |
| Distribution | 07 to 10 | 3. Too High  | 3      |

Есть ли динамический способ сделать это?

1 Ответ

0 голосов
/ 17 января 2019

Вы можете использовать pd.concat с groupby и использовать пользовательскую функцию для заполнения логики:

# convert to numeric
df['Number'] = pd.to_numeric(df['Number'])

# assign values by index
def filler(x):
    idx = np.where(x['Number'].notnull())[0]
    x.iloc[:idx[0], -2:] = ['1. Too Low', 1]
    x.iloc[idx[-1]+1:, -2:] = ['3. Too High', 3]
    return x

# concatenate transformed dataframe slices
res = pd.concat(df_slice.pipe(filler) for _, df_slice in df.groupby('Department'))

Результат:

print(res)

      Department     Range        Rating  Number
0          Admin  0 (None)    1. Too Low     1.0
1          Admin   01 to 3    1. Too Low     1.0
2          Admin   01 to 3    1. Too Low     1.0
3          Admin   01 to 3    1. Too Low     1.0
4          Admin   04 to 6  2. On Target     2.0
5          Admin   04 to 6  2. On Target     2.0
6          Admin   04 to 6  2. On Target     2.0
7          Admin  07 to 10   3. Too High     3.0
8          Admin  07 to 10   3. Too High     3.0
9          Admin  07 to 10   3. Too High     3.0
10         Admin  07 to 10   3. Too High     3.0
11  Distribution  0 (None)    1. Too Low     1.0
12  Distribution   01 to 3    1. Too Low     1.0
13  Distribution   01 to 3    1. Too Low     1.0
14  Distribution   01 to 3    1. Too Low     1.0
15  Distribution   04 to 6  2. On Target     2.0
16  Distribution   04 to 6  2. On Target     2.0
17  Distribution   04 to 6  2. On Target     2.0
18  Distribution  07 to 10   3. Too High     3.0
19  Distribution  07 to 10   3. Too High     3.0
20  Distribution  07 to 10   3. Too High     3.0
21  Distribution  07 to 10   3. Too High     3.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...