如何在Python Pandas中拆分字符串中的数字与字母
拆分Pandas DataFrame中混合字符串的数字与字母部分
针对你提供的DataFrame,其中部分单元格包含数字与字母混合的字符串(如"2.3trillion"),可以通过正则表达式结合Pandas的str.extract方法精准拆分数字与字母部分,以下是具体实现:
核心方案:使用str.extract匹配数字与文本
利用正则表达式^(\d*\.?\d*)(.*)$可以精准匹配两类内容:
(\d*\.?\d*):匹配整数或小数形式的数字部分(支持空值,对应无数字的情况)(.*):匹配剩余的所有文本部分(支持空值,对应纯数字的情况)
完整代码示例
import pandas as pd # 初始化你的DataFrame df = pd.DataFrame({'A': ['2.3trillion', '9', '3.4trillion'], 'B': ['8', '1.2trillion', '3trillion'], 'C': ['0.1trillion', '12', '2trillion'], 'D': ['42trillion', '52trillion','trillion']}) # 对所有列应用拆分,生成包含数字和文本的新DataFrame split_result = df.apply(lambda col: col.str.extract(r'^(\d*\.?\d*)(.*)$')) # 重命名列,明确区分数字与文本部分 split_result.columns = [f"{orig_col}_{suffix}" for orig_col in df.columns for suffix in ['num', 'text']] # 可选:将数字列转换为数值类型(无数字的行自动转为NaN) for col in split_result.columns: if '_num' in col: split_result[col] = pd.to_numeric(split_result[col], errors='coerce') print(split_result)
输出效果
拆分后的结果会为原DataFrame的每一列生成两个新列:
- 以
_num结尾的列:存储数字部分(已转为数值类型,无数字则为NaN) - 以
_text结尾的列:存储字母部分(纯数字行则为空字符串)
例如,原D列的trillion行,拆分后D_num为NaN,D_text为trillion;原A列的9行,A_num为9.0,A_text为空字符串。
备选方案:使用str.split分割数字与字母
如果偏好使用分割方法,可以利用正则断言在数字与字母的边界处分割:
split_result = df.apply(lambda col: col.str.split(r'(?<=\d)(?=[a-zA-Z])', expand=True)) split_result.columns = [f"{orig_col}_{suffix}" for orig_col in df.columns for suffix in ['num', 'text']] # 填充空值,统一处理无数字或纯数字的情况 split_result = split_result.fillna('')
不过这种方法对无数字的字符串(如trillion)会生成空的num列,需要额外填充空值,不如str.extract直接高效。
内容的提问来源于stack exchange,提问作者kkerk
相关产品推荐
相关产品推荐

