【问题标题】:Preserve order of dataframe after merge合并后保留数据框的顺序
【发布时间】:2018-11-24 09:32:48
【问题描述】:

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

我已成功将具有正确值的新列'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')

在生成的df_mo 中仍然没有保留df1 的原始顺序:

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(),但没有运气。

【问题讨论】:

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


    【解决方案1】:

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

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

    how : {‘left’, ‘right’, ‘outer’, ‘inner’}, 默认‘inner’

    • 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
    

    【讨论】:

    • how='left' 部分实际上使它保持订单
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 2021-10-17
    • 2018-01-07
    • 1970-01-01
    • 2021-09-02
    • 2019-08-25
    相关资源
    最近更新 更多