如何按年份、球员姓名两个匹配字段合并两个Numpy数组
Python基于双关键字合并棒球赛事统计Numpy数组方案
这种结构化数据的多字段匹配合并操作,优先推荐用Pandas实现,语法简洁且边界处理完善,也可以根据需求选择纯Numpy原生实现:
方案1:使用Pandas实现(推荐)
import pandas as pd import numpy as np # 替换为你已经读取完成的两个Numpy数组:薪资数组、赛事统计数组 salary_arr = 你的薪资Numpy数组 stat_arr = 你的赛事统计Numpy数组 # 转为DataFrame并指定列名,字段名可根据你的实际情况调整 df_salary = pd.DataFrame(salary_arr, columns=['年份', '球员姓名', '薪资']) df_stat = pd.DataFrame(stat_arr, columns=['年份', '球员姓名', '打击率', '打点']) # 按年份+球员姓名双字段匹配做内连接,自动去重重复的匹配字段 merged_df = pd.merge(df_salary, df_stat, on=['年份', '球员姓名'], how='inner') # 如需转回Numpy数组,调用values属性即可 merged_arr = merged_df.values
该方案完全符合双字段同时匹配的要求,只有年份和姓名同时一致的行才会被合并,合并结果中不会重复保留匹配用的公共字段。
方案2:纯Numpy原生实现
核心逻辑是为每行生成(年份, 球员姓名)的唯一匹配键,找到两个数组的共同键后拼接对应行的非重复字段:
import numpy as np # 替换为你已经读取完成的两个Numpy数组 salary_arr = 你的薪资Numpy数组 stat_arr = 你的赛事统计Numpy数组 # 生成两个数组的匹配键集合 keys1 = np.array([tuple(row[:2]) for row in salary_arr]) keys2 = np.array([tuple(row[:2]) for row in stat_arr]) # 提取共同匹配键和对应的行索引 common_keys, idx1, idx2 = np.intersect1d(keys1, keys2, return_indices=True) # 拼接行:保留薪资数组的全部字段 + 赛事数组去掉前两个公共字段的剩余内容 merged_arr = np.column_stack([salary_arr[idx1], stat_arr[idx2, 2:]])
注意事项
- 若需要保留某一侧数组的全部行(含未匹配行),可将Pandas
merge方法的how参数调整为left/right/outer,分别对应左连接、右连接、全连接 - 纯Numpy方案默认输出按匹配键排序的结果,如需保留原数组的行顺序,可自行调整索引匹配逻辑
内容的提问来源于stack exchange,提问作者A. Boy
相关产品推荐
相关产品推荐

