You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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方法实现需求,步骤如下:

  1. 导入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)
  1. 定义处理每行数据的函数:
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'])
  1. 应用函数到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
  1. 拆分编码前缀和后缀,得到第二种预期格式:
# 拆分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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:15:07