如何在填充单元格前后填充空白 Space?
How Do I Fill Blank Space Before and After Filled Cells?
我正在努力尝试按部门 属性 对我的数据进行分组,然后在分组后填写 space 上方和下方的两个字段,这些字段在 属性 中间填写数据集(评级和编号)。
我试过让 groupby 工作但无济于事。我的计划是让 groupby 工作,然后应用以下代码来查看我是否可以让填充正常工作。
# This won't work on its own because I need to group the data first.
df = df.mask(df == 0).ffill()
这就是我的开头:
|部门|范围 |评级 |编号 |
|------------|------------|------------|-------- |
|管理员 | 0 (None) | | |
|管理员 | 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 (None) | | |
|分布 | 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 (None) | 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 (None) | 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
我正在努力尝试按部门 属性 对我的数据进行分组,然后在分组后填写 space 上方和下方的两个字段,这些字段在 属性 中间填写数据集(评级和编号)。
我试过让 groupby 工作但无济于事。我的计划是让 groupby 工作,然后应用以下代码来查看我是否可以让填充正常工作。
# This won't work on its own because I need to group the data first.
df = df.mask(df == 0).ffill()
这就是我的开头:
|部门|范围 |评级 |编号 | |------------|------------|------------|-------- | |管理员 | 0 (None) | | | |管理员 | 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 (None) | | | |分布 | 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 (None) | 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 (None) | 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