假设我有一个看起来像这样的数据框:
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_
,这使我很难测试+确保准确性。
我执行的合并正确吗?
答案 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)