Python 如何在填充单元格前后填充空格?

Python 如何在填充单元格前后填充空格?,python,pandas,dataframe,fillna,Python,Pandas,Dataframe,Fillna,我正在尝试按部门属性对数据进行分组,然后将其分组后,在数据集中间填充的两个字段(评级和编号)的上方和下方填充空间 我试过让groupby工作,但没有用。我的计划是让groupby工作,然后应用下面的代码,看看是否可以让填充正确工作 # This won't work on its own because I need to group the data first. df = df.mask(df == 0).ffill() 这就是我的出发点: | Department | Ran

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

我试过让groupby工作,但没有用。我的计划是让groupby工作,然后应用下面的代码,看看是否可以让填充正确工作

# 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 | | | |部门|范围|评级|编号| |--------------|----------|--------------|--------| |管理员| 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 | || 这就是我想要的

| 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 | |部门|范围|评级|编号| |--------------|----------|--------------|--------| |行政| 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|
有什么动态的方法可以做到这一点吗

您可以将
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

谢谢@jpp的快速回复。这将返回以下错误:
试图在数据帧的切片副本上设置值。尝试使用.loc[row\u indexer,col\u indexer]=value,请参见文档中的注意事项:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-查看与复制self.obj[item]=s
这是一个警告,而不是一个错误:检查您的结果,它应该仍然有效。在某些情况下,您可以直接忽略警告。好的,运行它,检查输出,然后输出以下内容:++------------------++------------------++-------------++-------------++-------------++-------------+--------------部门|范围|评级|编号|+--------------++-------------+--------------管理| 04到6 | 2。关于目标| 2 |分布| 04到6 | 2。在目标| 2 |+--------------+--------------+--------------+-------------+道歉上,不确定是否要在注释中格式化表@jpp@EmnutOggionni,好的,我不能用你提供的数据复制。