3

我正在尝试按部门属性对我的数据进行分组,然后将其分组后填写数据集中间填充的两个字段(评级和数字)上方和下方的空间。

我曾尝试让 groupby 工作,但无济于事。我的计划是让 groupby 工作,然后应用以下代码来查看是否可以让填充正常工作。

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

这就是我要开始的:

| 部门 | 范围 | 评级 | 号码 |
|-------------|----------|--------------|-------- |
| 管理员 | 0(无)| | |
| 管理员 | 01至3 | | |
| 管理员 | 01至3 | | |
| 管理员 | 01至3 | | |
| 管理员 | 04至6 | 2. 目标 | 2 |
| 管理员 | 04至6 | 2. 目标 | 2 |
| 管理员 | 04至6 | 2. 目标 | 2 |
| 管理员 | 07 至 10 | | |
| 管理员 | 07 至 10 | | |
| 管理员 | 07 至 10 | | |
| 管理员 | 07 至 10 | | |
| 分销 | 0(无)| | |
| 分销 | 01至3 | | |
| 分销 | 01至3 | | |
| 分销 | 01至3 | | |
| 分销 | 04至6 | 2. 目标 | 2 |
| 分销 | 04至6 | 2. 目标 | 2 |
| 分销 | 04至6 | 2. 目标 | 2 |
| 分销 | 07 至 10 | | |
| 分销 | 07 至 10 | | |
| 分销 | 07 至 10 | | |
| 分销 | 07 至 10 | | |

这就是我要的

| 部门 | 范围 | 评级 | 号码 |
|-------------|----------|--------------|-------- |
| 管理员 | 0(无)| 1. 太低 | 1 |
| 管理员 | 01至3 | 1. 太低 | 1 |
| 管理员 | 01至3 | 1. 太低 | 1 |
| 管理员 | 01至3 | 1. 太低 | 1 |
| 管理员 | 04至6 | 2. 目标 | 2 |
| 管理员 | 04至6 | 2. 目标 | 2 |
| 管理员 | 04至6 | 2. 目标 | 2 |
| 管理员 | 07 至 10 | 3. 太高 | 3 |
| 管理员 | 07 至 10 | 3. 太高 | 3 |
| 管理员 | 07 至 10 | 3. 太高 | 3 |
| 管理员 | 07 至 10 | 3. 太高 | 3 |
| 分销 | 0(无)| 1. 太低 | 1 |
| 分销 | 01至3 | 1. 太低 | 1 |
| 分销 | 01至3 | 1. 太低 | 1 |
| 分销 | 01至3 | 1. 太低 | 1 |
| 分销 | 04至6 | 2. 目标 | 2 |
| 分销 | 04至6 | 2. 目标 | 2 |
| 分销 | 04至6 | 2. 目标 | 2 |
| 分销 | 07 至 10 | 3. 太高 | 3 |
| 分销 | 07 至 10 | 3. 太高 | 3 |
| 分销 | 07 至 10 | 3. 太高 | 3 |
| 分销 | 07 至 10 | 3. 太高 | 3 |

有没有动态的方法来做到这一点?

4

1 回答 1

1

您可以使用pd.concatgroupby利用自定义函数来填充逻辑:

# 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
于 2019-01-16T23:36:47.423 回答