合并后保留数据框的顺序

Tim*_*sen 3 python merge dataframe python-3.x pandas

我有一个dataframe df1,需要'h[mm]'附加一个新列。'h[mm]'应该df2根据df1'Profile'列中的值来查找新值。可以将这种情况与Excel的“ vlookup”或“ index / match”进行比较。

我已成功将'h[mm]'具有正确值的新列添加到df1。但是,它更改了原始顺序,对于df1我而言,这是不希望的。

该dataframes的简化重复性版本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})
Run Code Online (Sandbox Code Playgroud)

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

df_mo= pd.merge_ordered(df1, df2, left_by='Profile')
Run Code Online (Sandbox Code Playgroud)

仍然不会保留原来的顺序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
Run Code Online (Sandbox Code Playgroud)

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

ALo*_*llz 5

使用: 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
Run Code Online (Sandbox Code Playgroud)

  • 'how ='left'`部分实际上使它保持顺序 (3认同)