Pandas实现:前列为指定值时填充后续连续空值(大规模数据集)
高效处理大规模Pandas数据集的填充需求
需求说明
处理含260列、约130万行的大规模数据集,实现逻辑:对每一行,若某列的值为"NA",则将该列之后的连续空字符串列填充为"NA",直至遇到非空值列为止。
示例数据
原始数据集
import pandas as pd data=[[1,'NA','','','','Inactive',''], [2,'NA','','Active','',''], [3,'Active','Active','','',''], [4,'Inactive','','','',''], [5,'NA','','','','Active']] df1=pd.DataFrame(data,columns=['ID','S1','S2','S3','S4','S5'])
期望结果数据集
import pandas as pd data=[[1,'NA','NA','NA','NA','Inactive',], [2,'NA','NA','Active','',''], [3,'Active','Active','','',''], [4,'Inactive','','','',''], [5,'NA','NA','NA','NA','Active']] df1=pd.DataFrame(data,columns=['ID','S1','S2','S3','S4','S5'])
尝试的无效代码
for column in df1.columns: if (df1[column-1]=="NA").any(): df1[column]=df1.fillna("NA", inplace=True)
高效实现方案
针对大规模数据集,优先采用矢量化操作避免逐行循环,保证处理效率:
import pandas as pd # 加载原始数据(示例用给定数据) data=[[1,'NA','','','','Inactive',''], [2,'NA','','Active','',''], [3,'Active','Active','','',''], [4,'Inactive','','','',''], [5,'NA','','','','Active']] df1=pd.DataFrame(data,columns=['ID','S1','S2','S3','S4','S5']) # 1. 创建标记矩阵:标记值为"NA"的位置 na_mask = df1 == "NA" # 2. 创建标记矩阵:标记非空字符串的位置(排除"NA") non_empty_mask = (df1 != "") & ~na_mask # 3. 计算每行的填充触发状态:遇到"NA"后保持True,直到遇到非空值 trigger = na_mask.cumsum(axis=1) > 0 # 4. 计算每行的填充终止位置:从右往左累积标记终止位置,再反转回原顺序 close_cumsum = non_empty_mask.iloc[:, ::-1].cummax(axis=1).iloc[:, ::-1] # 5. 确定需要替换的位置:触发填充且未到终止位置,同时当前值为空字符串 replace_mask = trigger & ~close_cumsum & (df1 == "") # 6. 执行填充操作 df1.loc[replace_mask] = "NA" print(df1)
代码说明
- 所有操作均为Pandas矢量化运算,避免逐行循环,处理130万级数据效率远高于
apply(axis=1) na_mask标记触发填充的起始点non_empty_mask标记填充的终止点(遇到非"NA"的非空值时停止)trigger控制填充状态的开启,close_cumsum控制填充状态的关闭- 最终通过
replace_mask精准定位需要替换为空字符串的位置,批量替换为"NA"
内容的提问来源于stack exchange,提问作者Amish Baghel
相关产品推荐
相关产品推荐

