python - 在存储所有其他数据并保留原始顺序的同时执行合并
问题描述
假设我有一个如下所示的数据框:
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_
另一方面使我难以针对+确保准确性进行测试。
我是否正确执行合并?
解决方案
这只需要一些简单的排序逻辑:
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)
推荐阅读
- google-chrome - chrome 参数禁用保存密码提示
- python - 如何在不阻塞线程的情况下将值从线程传输到主程序?
- java - 为什么 java8'annotation @Contened 使用 128 字节,这是大多数硬件上缓存行大小的两倍
- r - 使用交互式文本绘图不使用 geom_line()
- android - android compose detectDragGestures'onDrag中的拖动或输入移动精度
- haskell - 如何修复我的代码以适用于所有测试?
- r - 调整表生成和请求以在 Shiny 中生成表
- c - 为什么Linux模块反汇编中的callq指令总是调用下一条指令?
- python - 内核在 juypter 笔记本中死机
- java - Phoenix-Spark-5.0.0-HBase-2.0 与 scala 2.12 的兼容性