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

如何在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') 

根本跑不起来或者没效果,原因有三个:

  1. *是正则通配符,直接用str.contains('*')会匹配任意字符,要匹配星号本身得写成str.contains('\*')
  2. str.contains返回的是一整列布尔值,不是单个True/False,直接丢if里会触发报错(Pandas不允许把Series转成单个布尔值判断)
  3. 就算判断逻辑对了,整列转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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:05:20