如何在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
相关产品推荐
相关产品推荐

