使用Pandas Merge替代循环匹配DataFrame失败,求解决方案
解决Pandas Merge时提示未知key(gameid)的问题
错误原因
你在循环里用value.to_frame()处理iterrows()返回的单行Series时,会把原Series的索引转为DataFrame的列,而原来的gameid是原DataFrame的列,此时变成了新DataFrame的行值,不再是列名,所以merge时找不到gameid这个key。
正确解决方案(高效版)
完全不需要逐行循环,直接对两个完整的DataFrame执行merge操作——这是Pandas专为批量数据匹配设计的矢量化方法,处理80万行数据的效率比双层循环高几个数量级:
import pandas as pd mergeTwo = pd.read_json('merge/mergeUpdate.json') matches = pd.read_csv('archive/matches.csv') # 执行全量merge,on指定匹配的key,how指定连接方式(按需选择) # how参数可选:inner(默认,只保留两边都有匹配的行)/left(保留mergeTwo所有行,匹配不到的补NaN)/right/outer merged_result = pd.merge(mergeTwo, matches, on='gameid', how='inner') # 查看结果 print(merged_result.head()) print(f"匹配完成,共得到{len(merged_result)}条结果")
为什么原来的循环方式不可取
- 效率极低:
iterrows()本身是逐行遍历,加上双层循环,处理80万行数据会耗时极久,完全违背Pandas的设计初衷。 - 数据结构错误:如前文所述,单行Series转DataFrame时结构发生了变化,导致
gameid不再是可用于merge的列。
如果非要测试单行匹配(仅作调试用,不推荐生产环境),需要把索引转回列:
for index, value in mergeTwo.iterrows(): # 将单行Series转成标准结构的DataFrame,把原列名恢复为列 value_df = value.to_frame().T test = value_df.merge(matches, on='gameid') print(test)
内容的提问来源于stack exchange,提问作者Akael
相关产品推荐
相关产品推荐

