如何以第一列为索引拼接两个不同ndarray且不转换为pandas DataFrame
纯NumPy实现按首列匹配合并数组方案
不需要转pandas,直接用NumPy原生接口就能实现,核心是用排序+二分查找做键匹配,效率比纯循环高很多。
实现步骤
- 提取两个数组的首列作为匹配键,拼接后排序去重,得到结果集的完整首列
- 初始化形状为
(唯一键总数, 3)的结果数组,默认填充np.nan,把排序后的唯一键填入第一列 - 用
np.searchsorted分别找到两个原数组的键在完整首列中的索引位置,把原数组第二列的对应值填入结果数组的第二、第三列
可运行代码
import numpy as np # 测试数据 rec_np = np.array([[1, 4], [2, 4], [6, 1], [7, 3]]) test_np = np.array([[2, 5], [3, 1], [11, 3]]) # 提取所有匹配键,排序去重 key_col1 = rec_np[:, 0] key_col2 = test_np[:, 0] all_keys = np.sort(np.unique(np.concatenate([key_col1, key_col2]))) # 初始化结果数组,默认填nan result = np.full(shape=(len(all_keys), 3), fill_value=np.nan) result[:, 0] = all_keys # 填充rec_np对应的第二列 pos1 = np.searchsorted(all_keys, key_col1) result[pos1, 1] = rec_np[:, 1] # 填充test_np对应的第三列 pos2 = np.searchsorted(all_keys, key_col2) result[pos2, 2] = test_np[:, 1]
运行输出
[[ 1. 4. nan] [ 2. 4. 5.] [ 3. nan 1.] [ 6. 1. nan] [ 7. 3. nan] [11. nan 3.]]
注意事项
- 因为
np.nan是浮点类型,最终输出数组的dtype为float,如果需要整数类型,可以把缺失值替换为业务允许的整数占位符(如-999)后再转换数组类型 - 该实现用二分查找做位置匹配,数据量较大时性能远高于Python原生循环或者字典映射方案
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

