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

如何用Python Pandas填充DataFrame的ColumnB空值继承前序有效值

问题描述

创建如下DataFrame:

import numpy as np
import pandas as pd

my_df = pd.DataFrame(
    {'ColumnA':['Value A', '', 'Value B', '', '', 'Value C',''],
     'ColumnB':['', '', '', '', '', '', '']})

初始状态:

ColumnA | ColumnB
0   Value A | 
1           | 
2   Value B | 
3           | 
4           |  
5   Value C | 
6           | 

尝试用以下逻辑填充ColumnB:

conditions = [
    my_df['ColumnA'] == '',
    my_df['ColumnA'] != '']
result = [my_df['ColumnA'].shift(1),
          my_df['ColumnA']]
my_df['ColumnB'] = np.select(conditions, result)

执行后第4行ColumnB仍为空:

ColumnA | ColumnB
0     Value A   | Value A
1               | Value A
2     Value B   | Value B
3               | Value B
4               | 
5     Value C   | Value C
6               | Value C

期望所有空值继承最近的ColumnA非空值,效果如下:

ColumnA | ColumnB
0       Value A | Value A
1               | Value A
2       Value B | Value B
3               | Value B
4               | Value B
5       Value C | Value C
6               | Value C
解决方案

方法1:使用ffill()前向填充(推荐)

ffill()(forward fill)会自动用最近的非空值填充后续空值,是处理这类需求最简洁的方案。注意需要先把空字符串替换为NaN,因为ffill()仅识别Pandas中的空值标记NaN:

import numpy as np
import pandas as pd

my_df = pd.DataFrame(
    {'ColumnA':['Value A', '', 'Value B', '', '', 'Value C',''],
     'ColumnB':['', '', '', '', '', '', '']})

# 将ColumnA中的空字符串替换为NaN
my_df['ColumnA'] = my_df['ColumnA'].replace('', np.nan)
# 前向填充后赋值给ColumnB
my_df['ColumnB'] = my_df['ColumnA'].ffill()

# 可选:将ColumnA还原为原格式(NaN转回空字符串)
my_df['ColumnA'] = my_df['ColumnA'].fillna('')

方法2:修复原有np.select逻辑

原方法仅取前一行的原始值,无法处理连续空值的情况。可以先对ColumnA做前向填充,再用填充后的值赋值:

import numpy as np
import pandas as pd

my_df = pd.DataFrame(
    {'ColumnA':['Value A', '', 'Value B', '', '', 'Value C',''],
     'ColumnB':['', '', '', '', '', '', '']})

# 生成临时填充后的ColumnA
filled_colA = my_df['ColumnA'].replace('', np.nan).ffill()
# 赋值给ColumnB
my_df['ColumnB'] = filled_colA

原方法失效原因

原代码中my_df['ColumnA'].shift(1)仅取前一行的原始值,第4行的前一行(第3行)ColumnA为空字符串,导致shift后仍为空。而ffill()会递归查找最近的非空值,解决了连续空值的填充问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:10:30