如何填充填充单元格前后的空白区域?

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 |

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

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

感谢@jpp的迅速回复。出现以下错误:“正在尝试在DataFrame的副本切片上设置值。请改用.loc [row_indexer,col_indexer] = value请参阅文档中的注意事项:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy self.obj [item] = s” - Emmett Ogiony
1
那是一条警告,而不是错误:检查你的结果,它应该仍然可以工作。有一些情况下你可以简单地忽略这个警告。 - jpp
好的,运行了它,检查了输出,它输出如下:+--------------+---------+---------------+--------+ | 部门 | 范围 | 评级 | 数量 | +--------------+---------+---------------+--------+ | 行政部门 | 04 至 6 | 2. 目标达成 | 2 | | 分销部门 | 04 至 6 | 2. 目标达成 | 2 | +--------------+---------+---------------+--------+ - Emmett Ogiony
1
@EmnutOggionni,好的,我无法使用您提供的数据进行复制。 - jpp
当然,我把变量放错了位置。回复晚了,非常抱歉! - Emmett Ogiony
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接