如何仅按开头数字拆分Pandas列且保留后续所有字符?
解决Pandas拆分列时丢失后续数字的问题
我来帮你搞定这个正则表达式的问题!你遇到的核心问题是原正则只匹配了字母部分,没把字母后面的数字包含进去,导致这部分内容丢失了。
问题根源
你原来用的正则(\d+)([A-Za-z]*)中,第二组[A-Za-z]*只能匹配任意数量的字母,一旦遇到字母后的数字,正则就会停止匹配这部分,所以像SW1里的1就被漏掉了。
修正方案
我们只需要把第二组的正则改成匹配数字之后的所有内容(不管是字母还是数字),就可以保留完整的后续部分。推荐使用这个正则:^(\d+)(.*)
^(\d+):匹配字符串开头的连续数字,作为第一组(对应你要保留的开头数字)(.*):匹配开头数字之后的所有剩余内容,包括字母、数字等任意字符,作为第二组
修改后的代码
import pandas as pd import numpy as np data = np.array([['Col1','Col2'], ['1','05MW'], ['2','16MW'], ['3','05SW1'], ['4','05SW2']]) df = pd.DataFrame(data=data[1:,:], index=data[1:,0], columns=data[0,:]) # 替换正则表达式,这里把拆分后的数字列命名为Col2_num更清晰,你也可以根据需求调整 df[['Col2_num', 'id']] = df['Col2'].str.extract('^(\d+)(.*)', expand=True) print(df)
执行结果
Col1 Col2 Col2_num id 1 1 05MW 05 MW 2 2 16MW 16 MW 3 3 05SW1 05 SW1 4 4 05SW2 05 SW2
如果你希望更严谨一点(确保第二部分必须以字母开头,避免开头数字后直接跟数字的情况),可以用这个正则:^(\d+)([A-Za-z].*),它会要求第二组以字母开头,然后再匹配后续的所有内容,同样能满足你的示例需求。
内容的提问来源于stack exchange,提问作者chitown88
相关产品推荐
相关产品推荐

