You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中按条件填充Outline_level列的N/A值(下方值减1)

填充DataFrame中Outline_level列的N/A值为下方单元格值减1

原始DataFrame

import pandas as pd

data = [['1', 'Construction', '', '01/02/2022', '01/06/2022', '1', 'No'], ['N/A', 'Level Site', 'Construction', '01/02/2022', '01/02/2022', '2', 'No'], ['3', 'Foundation', '', '01/03/2023', '01/06/2023', '1', 'Yes'],['2', 'Lay Foundation', 'Construction>Foundation', '01/03/2022', '01/04/2022', '3', 'No'], ['N/A', 'Prepare land for foundation', 'Construction>Foundation', '01/05/2022', '01/06/2022', '3', 'No'],['2', 'Building Envelope', '', '01/07/2023', '01/16/2023', '1', 'No'], ['2', 'Install Footings', 'Building Envelope', '01/07/2022', '01/07/2022', '2', 'Yes'], ['2', 'Pouring', '', '01/08/202', '01/09/2023', '1', 'No'],['N/A', 'Pour Foundation', 'Building Envelope>Pouring', '01/08/2022', '01/09/2022', '3', 'No'], ['2', 'Installation', '', '01/09/2022', '01/14/2022', '1', 'No']]
df1 = pd.DataFrame(data, columns=['Outline_level',  'Activity', 'Parent', 'Start', 'Finish', 'WBS Level', 'Match'])

需求说明

需要将Outline_level列中的"N/A"值替换为其下方单元格数值减1,例如下方单元格值为3时,该单元格填充为2。尝试过bfill()方法,但无法对填充值执行减1操作。

期望的结果DataFrame

Ideal_data = [['1', 'Construction', '', '01/02/2022', '01/06/2022', '1', 'No'], ['2', 'Level Site', 'Construction', '01/02/2022', '01/02/2022', '2', 'No'], ['3', 'Foundation', '', '01/03/2023', '01/06/2023', '1', 'Yes'],['2', 'Lay Foundation', 'Construction>Foundation', '01/03/2022', '01/04/2022', '3', 'No'], ['1', 'Prepare land for foundation', 'Construction>Foundation', '01/05/2022', '01/06/2022', '3', 'No'],['2', 'Building Envelope', '', '01/07/2023', '01/16/2023', '1', 'No'], ['2', 'Install Footings', 'Building Envelope', '01/07/2022', '01/07/2022', '2', 'Yes'], ['2', 'Pouring', '', '01/08/202', '01/09/2023', '1', 'No'],['1', 'Pour Foundation', 'Building Envelope>Pouring', '01/08/2022', '01/09/2022', '3', 'No'], ['2', 'Installation', '', '01/09/2022', '01/14/2022', '1', 'No']]
df2 = pd.DataFrame(Ideal_data, columns=['Outline_level',  'Activity', 'Parent', 'Start', 'Finish', 'WBS Level', 'Match'])

解决方案

可以通过以下步骤实现需求:

  • 先将Outline_level列转为数值类型,把"N/A"转为NaN便于处理
  • 使用bfill()获取下方非空值,再对这些值执行减1操作
  • 将原列中的NaN值替换为计算后的结果,最后转回字符串类型以匹配原始数据格式

具体代码如下:

# 转换列类型,N/A转为NaN
df1['Outline_level'] = pd.to_numeric(df1['Outline_level'], errors='coerce')
# 向下填充后减1得到填充值
filled_values = df1['Outline_level'].bfill() - 1
# 替换NaN并转回字符串
df1['Outline_level'] = df1['Outline_level'].fillna(filled_values).astype(str)

# 查看结果
print(df1)

执行上述代码后,df1就会变成你期望的df2格式。

内容的提问来源于stack exchange,提问作者bcoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:27:49