如何在填充单元格之前和之后填充空白?

Posted

技术标签:

【中文标题】如何在填充单元格之前和之后填充空白?【英文标题】:How Do I Fill Blank Space Before and After Filled Cells? 【发布时间】:2019-06-11 02:32:44 【问题描述】:

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

我尝试让 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】:

您可以使用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 的快速回复。这将返回以下错误:A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy self.obj[item] = s 这是一个警告,而不是错误:检查你的结果,它应该仍然有效。在某些情况下,您可以直接忽略警告。 好的运行它,检查输出,它输出以下内容:+--------------+---------+-- -------------+--------+ |部门 |范围 |评级 |号码 | +--------------+---------+----------------+-------- + |管理员 | 04至6 | 2. 目标 | 2 | |分销 | 04至6 | 2. 目标 | 2 | +--------------+---------+----------------+-------- + 抱歉,不确定在 cmets @jpp 中格式化表格 @EmnutOggionni,好的,我无法使用您提供的数据进行复制。

以上是关于如何在填充单元格之前和之后填充空白?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据多个单元格中的值自动填充

Excel - 在表格中查找值并根据以前的数据填充空白单元格

自动填充留下空白的空白单元格

怎样快速批量填充WPS的空白单元格

Excel如何用文本填充所有选定的空白单元格

根据上面的非空白单元格填充空白单元格