特定模式在不同位置的子串

问题描述 投票:0回答:1

我的数据框中有一列,其中用于测试的所有设备都以代码形式存储并分组在一起。

data = [{'Equipment': 'C-FDO:ER09999,M-GEP:IO09765,P-EE047777,P-PP04757,P-IR07086,P-EE2222,P-ER20000,tEE3-ERE:CC046846'},
        {'Equipment': 'C-FDO:ER09999,M-GEP:IO09765,tEE3-ERE:CC04647, P-CC07777,P-PP047557,P-IR07086,P-EE2223,P-ER20000'},
        {'Equipment': 'tEE3-ERE:CC04648, C-FDO:ER7809999,M-GEP:IO09765,P-PP07777,P-PP04757,P-IR07086,P-EE2224,P-ER20000'},
        {'Equipment': 'C-FDO:ER09999,M-GEP:IO09765,P-PP07777, P-PP04757, tEE3-ERE:CC04649, P-ER01465,P-EE22250,P-ER201212000'}]

我需要获取每行中第 4 次出现的“P-”设备和所有出现的“tEE3-ERE”设备,但我无法通过位置切片来做到这一点,因为它们被洗牌了。 我尝试用逗号进行

split

,并通过extract进行一些regex,但它不起作用,因为我有多个“P-”。 所以我不需要任何其他出现的 P-(但第 4 个),也不需要其他设备,如“C-FDO”和“M-GEP”。

预期结果:

P-EE2222 tEE3-ERE:CC046846 P-EE2223 tEE3-ERE:CC04647 P-EE2224 tEE3-ERE:CC04648 P-EE22250 tEE3-ERE:CC04649 P- tEE3-ERE EE2222 CC046846 EE2223 CC04647 EE2224 CC04648 EE22250 CC04649


python pandas split extract
1个回答
0
投票

str.extractall

,过滤匹配号码(第 4 个为 3),并使用 
join
 提取 
tEE3-ERE
的值:
out = (df['Equipment'].str.extractall('P-([^,]+)')
       .query('match == 3').droplevel('match')
       .rename(columns={0: ('P-')})
       .join(df['Equipment'].str.extractall('tEE3-ERE:([^,]+)')[0]
             .droplevel('match').rename('tEE3-ERE'))
      )

输出:

P- tEE3-ERE 0 EE2222 CC046846 1 EE2223 CC04647 2 EE2224 CC04648 3 EE22250 CC04649

替代输出:

out = (df['Equipment'].str.extractall('(P-[^,]+)') .query('match == 3').droplevel('match') .join(df['Equipment'].str.extractall('(tEE3-ERE:[^,]+)')[0] .droplevel('match').rename(1)) ) 0 1 0 P-EE2222 tEE3-ERE:CC046846 1 P-EE2223 tEE3-ERE:CC04647 2 P-EE2224 tEE3-ERE:CC04648 3 P-EE22250 tEE3-ERE:CC04649

© www.soinside.com 2019 - 2024. All rights reserved.