我的数据框中有一列,其中用于测试的所有设备都以代码形式存储并分组在一起。
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
,过滤匹配号码(第 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