如何在Pandas DataFrame中先检测特定字符再修改格式
解决DataFrame带星号列的数字格式转换问题
需求场景
原始DataFrame:
0 1 2 0 1 02 3 1 1 04 04 2 1 54 04 3 1 * *
想要把列里像02这种带前置零的数字转成2,同时保留*不变,最终得到:
0 1 2 0 1 2 3 1 1 4 4 2 1 54 4 3 1 * *
原代码的问题
你之前写的代码:
if MasterDf.iloc[:,2].str.contains('*'): pass else: MasterDf.iloc[:,2] = MasterDf.iloc[:,2].astype('int64')
根本跑不起来或者没效果,原因有三个:
*是正则通配符,直接用str.contains('*')会匹配任意字符,要匹配星号本身得写成str.contains('\*')str.contains返回的是一整列布尔值,不是单个True/False,直接丢if里会触发报错(Pandas不允许把Series转成单个布尔值判断)- 就算判断逻辑对了,整列转
int64的时候,因为存在*这个非数字字符,转换直接失败
正确的解决方法
方法1:自定义函数逐个处理元素
逐个检查元素,是数字就转成整数(自动去掉前置零),是星号就保留:
def format_col(x): if x == '*': return x # 转成整数再转回字符串,自动去掉前置零 return str(int(x)) # 处理第2列(索引为2) MasterDf.iloc[:, 2] = MasterDf.iloc[:, 2].apply(format_col)
方法2:正则替换更高效
用正则直接匹配带前置零的数字,替换成去掉零的部分:
import re MasterDf.iloc[:, 2] = MasterDf.iloc[:, 2].apply( lambda x: re.sub(r'^0+(\d+)$', r'\1', x) if x != '*' else x )
这个正则的逻辑是:匹配以一个或多个0开头、后面跟着数字的字符串,去掉前面的0,只保留核心数字部分。比如02→2,04→4,54本身无前置零,保持不变。
验证结果
运行上面任意一种方法后,就能得到你想要的DataFrame格式,既处理了前置零的数字,又保留了星号标记。
内容的提问来源于stack exchange,提问作者Kenny
相关产品推荐
相关产品推荐

