如何在Pandas列中提取特定格式值并生成独立新列?
解决方案:提取符合格式的P#.S#内容到独立列
核心思路
因为目标字符串在Connections列中的位置不固定,直接按空格拆分无法精准定位,正则表达式是最优方案——它可以直接从整段字符串中匹配符合P1-12.S1-112格式的内容,自动排除不符合规则的项(比如P105.H10)。
正则表达式定义
针对需求的匹配规则,使用以下正则:
P([1-9]|1[0-2])\.S([1-9]|[1-9]\d|1[01][0-9]|11[0-2])
各部分含义:
P([1-9]|1[0-2]):匹配P后跟随1-12的数字(覆盖1-9、10、11、12)\.:匹配点号(转义处理,避免正则将点号识别为通配符)S([1-9]|[1-9]\d|1[01][0-9]|11[0-2]):匹配S后跟随1-112的数字(覆盖1-9、10-99、100-111、112)
Pandas 代码实现
单匹配项提取(每个Connections仅一个符合项)
import pandas as pd # 示例DF1数据 df1 = pd.DataFrame({ 'Name': ['SIGNAL 1', 'SIGNAL 2'], 'Connections': ['DF62.1 P8.S12 P105.H10 RK121.2', 'P3.S45 X99.0 P12.S112'] }) # 定义正则模式 pattern = r'P([1-9]|1[0-2])\.S([1-9]|[1-9]\d|1[01][0-9]|11[0-2])' # 提取匹配内容到新列 df1['Matched_PS'] = df1['Connections'].str.extract(pattern).apply( lambda x: f'P{x[0]}.S{x[1]}' if pd.notna(x[0]) else None, axis=1 )
多匹配项提取(每个Connections含多个符合项)
如果存在一个Connections字符串里有多个符合规则的P#.S#,可以用str.findall提取所有匹配项,再用分隔符拼接:
df1['Matched_PS'] = df1['Connections'].str.findall(pattern).apply( lambda x: ', '.join([f'P{a}.S{b}' for a, b in x]) if x else None )
复用处理DF2
DF2的处理逻辑完全一致,直接套用上述代码即可:
# 示例DF2数据 df2 = pd.DataFrame({ 'Connections': ['D101.1 K154A.4 P8.S12', 'P5.S78 P10.S100 Z200.3'] }) df2['Matched_PS'] = df2['Connections'].str.findall(pattern).apply( lambda x: ', '.join([f'P{a}.S{b}' for a, b in x]) if x else None )
效果说明
运行代码后,新列Matched_PS会精准提取所有符合规则的内容,自动忽略P105.H10这类不符合P后数字≤12的项,且不受目标字符串在Connections中的位置影响。
内容的提问来源于stack exchange,提问作者cavediver
相关产品推荐
相关产品推荐

