pandas DataFrame中vnum、seq列按规则批量替换失效的解决方案
适配需求的pandas实现方案
原代码存在的问题
- 行级赋值逻辑错误:
df[df['vnum'] == ''] = 'XXX 000000'属于整行赋值,满足条件的行的datetime、seq等所有列都会被替换成目标值,并非仅修改vnum列 - 全局操作无列限定:
df['vnum']=df.replace('', np.nan, inplace=True)是对整个DataFrame执行替换,且inplace=True的方法返回None,赋值后vnum列会全部变为None - seq列逻辑与需求不匹配:原代码将空值填充为'9999',和需求要求的'0000'不一致;最后一步
pd.to_numeric会把补好的前导零全部抹掉,转成数字后无法保留前导零格式
实现代码
先导入依赖:
import pandas as pd import numpy as np
vnum列处理
处理规则:所有长度小于10字符的值(包含空值、单空格、8/9字符短值),统一替换为XXX 000000
# 统一列内值为字符串格式,兼容整数、NaN等非字符串存储场景 df['vnum'] = df['vnum'].astype(str) # 处理类型转换产生的'nan'字符串 df['vnum'] = df['vnum'].replace('nan', '') # 按长度判断执行替换 df['vnum'] = np.where(df['vnum'].str.len() < 10, 'XXX 000000', df['vnum'])
seq列处理
处理规则:① 空值、单空格统一替换为0000;② 有效数值补前导零到4位
# 统一列内值为字符串格式,兼容整数、NaN等非字符串存储场景 df['seq'] = df['seq'].astype(str) # 识别原空值、空字符串、单空格的场景(含类型转换产生的'nan'字符串) df['seq'] = df['seq'].replace(['nan', '', ' '], '0000') # 去除首尾多余空格,补前导零到4位 df['seq'] = df['seq'].str.strip().str.zfill(4)
适配效果
- 样例中长度为9字符的
D 154070会被自动替换为XXX 000000 - 样例中的seq值867、177会自动转为4位带前导零的字符串
0867、0177 - 空值、单空格的场景会按规则替换,不会出现整列被覆盖、规则不生效的问题
内容的提问来源于stack exchange,提问作者user_v27
相关产品推荐
相关产品推荐

