如何在DataFrame所有列中删除'r'前为数字时'r'后的所有字符?
处理DataFrame列:删除数字后'r'及后续字符
需求说明
对DataFrame所有列执行操作:仅当'r'前为数字时,删除'r'及其之后的所有内容;保留原始NaN值,保留数字中的空格(如311 889)。
原始数据示例
1 311 889r/r +29.61%~sektor +21.56% 2 98 921r/r +218.42%~sektor +14.42% 3 NaN 4 37 215r/r +27.47%~sektor +11.80% 5 NaN 6 57 734r/r +5.28%~sektor -34.58% 7 89 883r/r -5.62%~sektor +2.74% 8 28 136r/r -7.12%~sektor +22.40% 9 385 084r/r +32.89%~sektor +32.89% ...
期望处理结果
1 311 889 2 98 921 3 NaN 4 37 215
当前DataFrame列数据类型
Unnamed: 0 object 2004 (gru 04) object 2005 (gru 05) object 2006 (gru 06) object 2007 (gru 07) object 2008 (gru 08) object 2009 (gru 09) object 2010 (gru 10) object 2011 (gru 11) object 2012 (gru 12) object 2013 (gru 13) object 2014 (gru 14) object 2015 (gru 15) object 2016 (gru 16) object 2017 (gru 17) object 2018 (gru 18) object 2019 (gru 19) object 2020 (gru 20) object 2021 (gru 21) object 2022/Q1 (mar 22) object Unnamed: 20 float64 dtype: object
解决方案
利用Pandas字符串替换功能结合正则表达式精准处理:
import pandas as pd # 筛选需要处理的object类型列(float64列无需操作) target_cols = df.select_dtypes(include=["object"]).columns # 对目标列应用正则替换,保留数字+空格部分,删除r及后续内容 df[target_cols] = df[target_cols].apply( lambda col: col.str.replace(r"(\d+(?:\s\d+)*)r.*", r"\1", regex=True) ) # 可选:将处理后产生的空字符串转为NaN,保持缺失值格式统一 df[target_cols] = df[target_cols].replace("", pd.NA)
正则表达式说明
(\d+(?:\s\d+)*):捕获由数字和空格组成的核心内容(支持多段数字+空格格式,如311 889)r.*:匹配目标'r'字符及其之后的所有内容- 替换为
\1:保留捕获的数字+空格部分,删除后续内容
该方案自动跳过NaN值,仅处理object类型列,不会影响float64数值列。
内容的提问来源于stack exchange,提问作者Manawryn
相关产品推荐
相关产品推荐

