如何从DataFrame的Equipment列提取第4个P-设备与所有tEE3-ERE设备?
问题
我有一个DataFrame,其中Equipment列存储了测试所用的所有设备编码,这些编码被组合在一起:
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"开头的设备编码,但编码顺序是打乱的,没法通过位置切片实现。我试过用pandas的str.split按逗号分割,也用过str.extract结合正则表达式,但因为存在多个"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
解决方案
可以通过自定义函数结合pandas的apply方法实现需求,步骤如下:
- 导入pandas并创建DataFrame:
import pandas as pd 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'}] df = pd.DataFrame(data)
- 定义处理每行数据的函数:
def extract_target_codes(equipment_str): # 按逗号分割并去除每个编码前后的空格 codes = [code.strip() for code in equipment_str.split(',')] # 筛选所有以P-开头的编码 p_codes = [code for code in codes if code.startswith('P-')] # 获取第4个P-编码(索引为3,从0开始计数) fourth_p = p_codes[3] if len(p_codes) >=4 else None # 筛选所有以tEE3-ERE开头的编码 tee_codes = [code for code in codes if code.startswith('tEE3-ERE')] # 取第一个tEE3-ERE编码(假设每行仅一个) tee_code = tee_codes[0] if tee_codes else None return pd.Series([fourth_p, tee_code], index=['Fourth_P', 'tEE3_ERE'])
- 应用函数到Equipment列,获取第一种预期格式:
result_df = df['Equipment'].apply(extract_target_codes) print(result_df)
输出:
Fourth_P tEE3_ERE 0 P-EE2222 tEE3-ERE:CC046846 1 P-EE2223 tEE3-ERE:CC04647 2 P-EE2224 tEE3-ERE:CC04648 3 P-EE22250 tEE3-ERE:CC04649
- 拆分编码前缀和后缀,得到第二种预期格式:
# 拆分P-编码的前缀和后缀 result_df[['P_Prefix', 'P_Suffix']] = result_df['Fourth_P'].str.split('-', expand=True) # 拆分tEE3-ERE编码的前缀和后缀 result_df[['tEE3_Prefix', 'tEE3_Suffix']] = result_df['tEE3_ERE'].str.split(':', expand=True) # 提取所需列并打印 split_result = result_df[['P_Prefix', 'tEE3_Prefix', 'P_Suffix', 'tEE3_Suffix']] print(split_result)
输出:
P_Prefix tEE3_Prefix P_Suffix tEE3_Suffix 0 P tEE3-ERE EE2222 CC046846 1 P tEE3-ERE EE2223 CC04647 2 P tEE3-ERE EE2224 CC04648 3 P tEE3-ERE EE22250 CC04649
内容的提问来源于stack exchange,提问作者Gabriel Santello
相关产品推荐
相关产品推荐

