首页 > 解决方案 > 在存储所有其他数据并保留原始顺序的同时执行合并

问题描述

假设我有一个如下所示的数据框:

idx  city           pop
A1   New York City  600
A2   Los Angeles    500
B1   Chicago        300
B2   Miami          200

和另一个看起来像这样的数据框

idx  city           pop
A1   (-1.05, 3.45)  6.5
A2   (-1.15, 3.55)  6.3
B1   (-1.25, 3.65)  5.7
B2   (-1.35, 3.75)  4.8

我想执行合并操作以实现以下目标:

idx  city_x         city_y         pop_x  pop_y
A1   New York City  (-1.05, 3.45)  600    6.5
A2   Los Angeles    (-1.15, 3.55)  500    6.3
B1   Chicago        (-1.25, 3.65)  300    5.7
B2   Miami          (-1.35, 3.75)  200    4.8

请注意,保留此数据列结构对我来说很重要...我希望它合并,因为它属于 x、y、x、y、x、y 格式

我目前正在执行的合并(到其他数据 - 不是这个虚拟数据):

result = pd.merge(df1, df2, left_on='idx', right_on='idx', how='left', suffixes=('_x', '_y'))

但这导致数据框_x一方面具有,y_另一方面使我难以针对+确保准确性进行测试。

我是否正确执行合并?

标签: pythonpandasmerge

解决方案


这只需要一些简单的排序逻辑:

v = df1.merge(df2, on='idx')
result = v[sorted(v.columns, key=lambda x: df1.columns.get_loc(x.split('_')[0]))]
result

  idx         city_x         city_y  pop_x  pop_y
0  A1  New York City  (-1.05, 3.45)    600    6.5
1  A2    Los Angeles  (-1.15, 3.55)    500    6.3
2  B1        Chicago  (-1.25, 3.65)    300    5.7
3  B2          Miami  (-1.35, 3.75)    200    4.8

这会根据原始 DataFrame 中的列名 less 后缀的位置对结果列进行重新排序。


如果列名不同,请使用

def sorter(x):
    df = df1 if x in df1.columns else df2
    return df.columns.get_loc(x.split('_')[0])

v = df1.merge(df2, ...)
result = v[sorted(v.columns, key=sorter)

推荐阅读