代码之家  ›  专栏  ›  技术社区  ›  Tim Skov Jacobsen

合并后保留数据帧的顺序

  •  2
  • Tim Skov Jacobsen  · 技术社区  · 8 年前

    我有一个数据框 df1 ,它需要有一个新列 'h[mm]' 附加的。新的价值观 'H[毫米] 应该向上看 df2 取决于中的值 DF1 的 'Profile' 列。这种情况可以与excel的“vlookup”或“index/match”进行比较。

    我已成功添加新列 'H[毫米] 使用正确的值 DF1 . 但是,它改变了原来的顺序 DF1 ,这在我的情况下是不需要的。

    数据帧的简化可复制版本 DF1 和 DF2 是:

    pile_type = ['P01', 'P20', 'P05', 'P23', 'P04', 'P01']
    profile = ['HE200A', 'HE220A', 'HE240B', 'NaN', 'HE200A', 'HE300B']
    df1 = pd.DataFrame({'Pile_type': pile_type, 'Profile': profile})
    
    profile_database = ['HE200A', 'HE220A', 'HE240B', 'HE500B', 'HE300B']
    profile_height_database = [190, 210, 240, 500, 300]
    df2 = pd.DataFrame({'Profile': profile_database, 'h[mm]': profile_height_database})
    

    我最接近的解决方案是 pd.merge_ordered() :

    df_mo= pd.merge_ordered(df1, df2, left_by='Profile')
    

    它仍然不能保持 DF1 在结果中 df_mo :

    print('df1:', df1)
    print('df2:', df2)
    print('df_mo:', df_mo)
    
    df1:    Pile_type Profile
    0       P01       HE200A
    1       P20       HE220A
    2       P05       HE240B
    3       P23       NaN
    4       P04       HE200A
    5       P01       HE300B
    
    df2:  Profile h[mm]
    0     HE200A  190
    1     HE220A  210
    2     HE240B  240
    3     HE500B  500
    4     HE300B  300
    
    df_mo:  Pile_type Profile  h[mm]
    0       P01       HE200A   190.0
    1       P04       HE200A   190.0
    2       P20       HE220A   210.0
    3       P05       HE240B   240.0
    4       P23       NaN      NaN
    5       P01       HE300B   300.0
    

    我也试过这个标准 pd.merge() 没有运气。

    1 回复  |  直到 8 年前
        1
  •  3
  •   ALollz    8 年前

    用途: df1.merge(df2, how='left')

    正如@graphir指出的那样, how 参数控制结果合并的顺序。 DataFrame

    如何:{左,右,外,内,默认

    • 左:只使用左框架中的键,类似于sql左外连接; 保留密钥顺序

    df1.merge(df2, on='Profile', how='left')
    
      Pile_type Profile  h[mm]
    0       P01  HE200A  190.0
    1       P20  HE220A  210.0
    2       P05  HE240B  240.0
    3       P23     NaN    NaN
    4       P04  HE200A  190.0
    5       P01  HE300B  300.0