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
相关产品推荐
相关产品推荐

