代码之家  ›  专栏  ›  技术社区  ›  anky

映射2个数据帧并替换目标数据帧中匹配值的标题

  •  2
  • anky  · 技术社区  · 6 年前

    我有一个数据帧:df1

      SAP_Name  SAP_Class  SAP_Sec
      Avi       5          C 
      Rison     6          A 
      Slesh     7          B 
      San       8          C 
      Sud       7          B 
    

    DF2:

    Name_Fi Class
    
    Avi     5 
    Rison   6 
    Slesh   7 
    

    我正在尝试将df2与df1匹配,这样匹配的值应该将头替换为与df1相同的头。

    SAP_Name  SAP_Class
     Ankan          5
     Rison          6
     Slesh          7
    

    下面是我使用的代码:

    d = {}
    for col2 in df2.columns:
        for col1 in df1.columns:
            cond = df2[col2].isin(df1[col1]).all()
            if cond:
               d[col2] = col1
    df2 = df2.rename(columns=d)
    print (df2)
    

    我可以在一个小文件中获得所需的输出,但是我的实际文件有112444行446列,要更改的目标文件有3行35列,在这种情况下,代码运行时间很长。有人能帮我吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   jezrael    6 年前

    在我看来,如果性能是重要的用途 issubset 具有 set :

    d = {}
    for col2 in df2.columns:
        for col1 in df1.columns:
            cond = set(df2[col2]).issubset(df1[col1])
            if cond:
               d[col2] = col1
    df2 = df2.rename(columns=d)
    print (df2)
      SAP_Name  SAP_Class
    0      Avi          5
    1    Rison          6
    2    Slesh          7
    

    编辑:

    #create dictioanry of Series without dupes
    dfs1 = {col1: df1[col1].drop_duplicates() for col1 in df1.columns}
    #print (dfs1)
    
    #create dictionary of sets
    set2 = {col2: set(df2[col2]) for col2 in df2.columns}
    #print (set2)
    
    #loop buy both dictionaries and find columns for rename
    d = {}
    for col2, v2 in set2.items():
        for col1, v1 in dfs1.items():
            cond = v2.issubset(v1)
            if cond:
               d[col2] = col1
    df2 = df2.rename(columns=d)
    print (df2)
      SAP_Name  SAP_Class
    0      Avi          5
    1    Rison          6
    2    Slesh          7
    
        2
  •  2
  •   piRSquared    6 年前

    我将重命名列并使用合并。

    cols = ['SAP_Name', 'SAP_Class']
    df2.set_axis(cols, axis=1, inplace=False).merge(df1[cols])
    
      SAP_Name  SAP_Class
    0      Avi          5
    1    Rison          6
    2    Slesh          7