代码之家  ›  专栏  ›  技术社区  ›  Josephine Fang

pandas列部分子字符串替换为另一个数据帧列(如果子字符串包含字符串)

  •  0
  • Josephine Fang  · 技术社区  · 1 年前

    当我试图用另一个数据帧中的字符串替换字符串时,我遇到了替换问题。

    以下是我的数据:

    import pandas as pd
    data={"ID": ["zx125", "zx137", "zx897", "zx567", "zx694"],"Long_string": ["TM~AA~Loc1::MH~CC~Loc1::LH~BF~Loc2::CM~CD~Loc2::CH~CD~Loc2", "MH~BGG~Loc1::LH~BF~Loc2::CM~RR~Loc2", "TM~VD~Loc1::MH~EC~Loc1::LH~BF~Loc2", "MH~BF~Loc1::LH~BF~Loc2::CH~CD~Loc2","DF~VD~Loc3::MH~EC~Loc1::LH~BF~Loc2::CH~CD~Loc2"]}
    df1 = pd.DataFrame(data)
    

    enter image description here

    mapping = {"Before Mapping": ["MH~CC~Loc1", "LH~BF~Loc2", "CH~CD~Loc2"],"After Mapping": ["MH~RT~Loc1","LH~BE~Loc2","CH~CE~Loc2"]}
    df2 = pd.DataFrame(mapping)
    

    enter image description here

    如何在原始数据帧中获取New_string。

    用join映射后,用df2替换。预期的输出数据帧。

    output={"ID": ["zx125", "zx137", "zx897", "zx567", "zx694"],"Long_string": ["TM~AA~Loc1::MH~CC~Loc1::LH~BF~Loc2::CM~CD~Loc2::CH~CD~Loc2", "MH~BGG~Loc1::LH~BF~Loc2::CM~RR~Loc2", "TM~VD~Loc1::MH~EC~Loc1::LH~BF~Loc2", "MH~BF~Loc1::LH~BF~Loc2::CH~CD~Loc2","DF~VD~Loc3::MH~EC~Loc1::LH~BF~Loc2::CH~CD~Loc2"],"New_string": ["TM~AA~Loc1::MH~RT~Loc1::LH~BE~Loc2::CM~CD~Loc2::CH~CE~Loc2", "MH~BGG~Loc1::LH~BE~Loc2::CM~RR~Loc2", "TM~VD~Loc1::MH~EC~Loc1::LH~BE~Loc2", "MH~BF~Loc1::LH~BE~Loc2::CH~CE~Loc2","DF~VD~Loc3::MH~EC~Loc1::LH~BE~Loc2::CH~CE~Loc2"]}
    desire_output = pd.DataFrame(output)
    

    enter image description here

    我尝试使用替换和应用程序。但是我不能得到想要的输出。

    谢谢你的帮助!

    1 回复  |  直到 1 年前
        1
  •  1
  •   Nick SamSmith1986    1 年前

    您可以通过拆分 Long_string 上的值 :: ,根据更换 df2 然后对索引进行分组 join 将这些值重新组合在一起:

    df1['New_string'] = (df1['Long_string']
        .str
        .split('::')
        .explode()
        .replace(df2.set_index('Before Mapping')['After Mapping'])
        .groupby(level=0)
        .agg('::'.join)
    )
    

    输出

          ID                                                 Long_string                                                  New_string
    0  zx125  TM~AA~Loc1::MH~CC~Loc1::LH~BF~Loc2::CM~CD~Loc2::CH~CD~Loc2  TM~AA~Loc1::MH~RT~Loc1::LH~BE~Loc2::CM~CD~Loc2::CH~CE~Loc2
    1  zx137                         MH~BGG~Loc1::LH~BF~Loc2::CM~RR~Loc2                         MH~BGG~Loc1::LH~BE~Loc2::CM~RR~Loc2
    2  zx897                          TM~VD~Loc1::MH~EC~Loc1::LH~BF~Loc2                          TM~VD~Loc1::MH~EC~Loc1::LH~BE~Loc2
    3  zx567                          MH~BF~Loc1::LH~BF~Loc2::CH~CD~Loc2                          MH~BF~Loc1::LH~BE~Loc2::CH~CE~Loc2
    4  zx694              DF~VD~Loc3::MH~EC~Loc1::LH~BF~Loc2::CH~CD~Loc2              DF~VD~Loc3::MH~EC~Loc1::LH~BE~Loc2::CH~CE~Loc2