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

