在存储所有其他数据并保留原始顺序的同时执行合并

时间:2019-03-11 19:33:58

标签: python pandas merge

假设我有一个看起来像这样的数据框:

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_,这使我很难测试+确保准确性。

我执行的合并正确吗?

1 个答案:

答案 0 :(得分:3)

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

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中列名后缀的位置对结果列进行重新排序。


如果列名不同,请使用

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)