合并后保留数据帧的顺序

时间:2018-06-14 14:50:53

标签: python python-3.x pandas dataframe merge

我有一个数据框df1,需要附加一个新列'h[mm]'。新'h[mm]'中的值应在df2中查找,具体取决于df1' 'Profile'列中的值。可以将这种情况与Excel的vlookup'进行比较。或者'索引/匹配'。

我已成功将新列'h[mm]'添加到df1的正确值。但是,它会更改原始df1的顺序,这在我的情况下是不可取的。

数据框df1df2的简化可重现版本为:

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 个答案:

答案 0 :(得分:2)

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

正如@Graipher指出的那样,how参数控制着合并DataFrame的顺序

  

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

     
      
  • left:仅使用左框架中的键,类似于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