python - 如何在填充单元格前后填充空白?

标签 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   | 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      |

有什么动态的方法可以做到这一点吗?

最佳答案

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

关于python - 如何在填充单元格前后填充空白?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54226658/

相关文章:

python - 对聚合值进行聚合

python - 在多维 numpy 数组中查找非零索引

python - 如何通过比较值范围来合并两个 pandas 数据帧(或传输值)

python - 查找具有与 id 匹配的最近时间戳的行,并添加具有值的行

python - sys.modules[__name__] = _classname()。它实际上有什么作用?

python - 从 SQL 结果构建逗号分隔的行列表

python - 根据特定日期值对 pandas 数据框进行子集化

python - fillna() 产生 NaN 值

python - 在 Plotly Indicator python 中显示相对和绝对差异

python - PyInstaller 和 OpenEXR - exe 崩溃