You need to enable JavaScript to run this app. Pandas:如何从混合类型DataFrame列提取数字并原地替换为纯数字
优惠活动
大模型
产品
解决方案
定价
更多

Pandas:如何从混合类型DataFrame列提取数字并原地替换为纯数字

提取列内数字的原地替换实现

你当前写法的小瑕疵

你现在写的df.A = df.A.str.extract('(\d+)')核心思路是对的,但存在结构匹配的问题:str.extract() 默认返回列名为0的单列表格(DataFrame),直接赋值给A列时,pandas会因为列名不匹配额外生成一个叫0的新列,没法完成预期的列替换。只要取到匹配结果的列值再赋值,就能正常工作。

低开销的原地替换实现

pandas的字符串处理方法本身不支持inplace=True参数,但直接对现有DataFrame的列做索引赋值时,操作会直接修改原DataFrame的内存块,和使用inplace=True的操作效果完全一致,不会产生多余的内存拷贝:

df['A'] = df['A'].str.extract(r'(\d+)')[0].astype(float)
  • 正则表达式(\d+)会匹配字符串中连续的数字片段,遇到原列里的NaN值会自然返回空值,不需要额外做空值兼容处理
  • 最后的astype(float)是为了把提取出来的字符串格式数字转成数值类型,匹配示例的输出要求

如果不想手动索引取第一列,可以给str.extract()加上expand=False参数,方法会直接返回匹配结果的Series,代码可以简化为:

df['A'] = df['A'].str.extract(r'(\d+)', expand=False).astype(float)

运行后的输出和你期望的效果完全一致:

A
0    1.0
1    NaN
2   10.0
3  100.0
4    0.0

如果需要纯整数类型的列,可以在剔除所有NaN值后再转int,保留浮点类型存储空值是pandas的常规操作,兼容性更好。

支持显式inplace=True的写法

如果你习惯直接使用带inplace标识的API,可以通过正则替换清除列内的非数字字符,显式开启原地修改:

# 正则匹配所有非数字字符并替换为空,直接修改原列
df['A'].replace(to_replace=r'[^0-9]', value='', regex=True, inplace=True)
# 把替换产生的空字符串还原为NaN,转换为数值类型
df['A'] = df['A'].replace('', np.nan).astype(float)

这种写法和前面的数字提取方法最终结果完全一致,只是在修改时显式指定了原地操作,不需要生成替换后的新列副本。


内容的提问来源于stack exchange,提问作者SteveS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 05:45:05