Python查找CSV索引列匹配行 将对应值追加至目标行下方
并排相似实体数据集归置实现方案
问题描述
现有左右并排存储相似实体的电子表格数据集,需要将表格右侧的匹配数据,归置到左侧对应主条目所在列的下方。
- 原始电子表格样例:

- 目标实现效果:

- 当前代码错误输出:

待处理数据集结构
| ID1 | Name1 | Country1 | Address1 | ID | Name2 | Country2 | Address2 | Score | City_Score |
|---|---|---|---|---|---|---|---|---|---|
| 2 | 1125874-STONETURN | UNITED STATES | 75 State St Ste 902 | 3 | 1125874-STONETURN | UNITED STATES | 75 State St Ste 902 | 100 | 100 |
| 10 | 1282357-VIMO | UNITED STATES | 2595 E Bayshore Rd Ste 250 | 11 | 1282357-VIMO | UNITED STATES | 2595 E Bayshore Rd Ste 250 | 100 | 100 |
| 14 | 1296837-INFRAHEALTH | UNITED STATES | 8705 Shoal Creek Blvd Ste 112 | 15 | 1296837-INFRAHEALTH | UNITED STATES | 8705 Shoal Creek Blvd Ste 112 | 100 | 100 |
| 17 | 1297217-BLAZE | UNITED STATES | 81 Larkfield Rd | 18 | 1297217-BLAZE | UNITED STATES | 81 Larkfield Rd | 100 | 100 |
| 24 | 1330177-AWSCUSTOMER1 | UNITED STATES | 112 E Pecan St | 25 | 1330177-AWSCUSTOMER2 | UNITED STATES | 112 E Pecan St | 83 | 100 |
| 27 | 1336739-FLEXTRADE-VMC-AWS | UNITED STATES | 111 Great Neck Rd | 28 | 1336739-FLEXTRADE-VMC-AWS | UNITED STATES | 111 Great Neck Rd | 100 | 100 |
| 58 | 5719679-ITACA TECH | UNITED STATES | 1395 Brickell Ave Ste 800 | 62 | 5719679-ITACA TECH | UNITED STATES | 1395 Brickell Ave Ste 800 | 100 | 100 |
| 58 | 5719679-ITACA TECH | UNITED STATES | 1395 Brickell Ave Ste 800 | 61 | 5719679-ITACA TECH | UNITED STATES | 1395 Brickell Ave Ste 800 | 100 | 100 |
| 58 | 5719679-ITACA TECH | UNITED STATES | 1395 Brickell Ave Ste 800 | 60 | 5719679-ITACA TECH | UNITED STATES | 1395 Brickell Ave Ste 800 | 100 | 100 |
| 58 | 5719679-ITACA TECH | UNITED STATES | 1395 Brickell Ave Ste 800 | 59 | 5719679-ITACA TECH | UNITED STATES | 1395 Brickell Ave Ste 800 | 100 | 100 |
原有代码错误点
原有实现代码如下:
import csv import pandas as pd df2 = df.copy() def target(index_of_file): index = index_of_file for index3 in df2.index: print(df2['ID2'][index3],df['Name2'][index3], df['Address2'][index3], df['Country2'][index3]) df = pd.read_csv('file.csv') for index in df.index: print(df['ID1'][index], ",", df['Name1'][index], ",", df['Address1'][index], ",",df['Country1'][index]) Targetindex = df['ID1'] target(Targetindex)
核心错误共3处:
- 执行顺序错误:
df2 = df.copy()写在pd.read_csv读取文件之前,此时df变量未定义,代码会直接抛出名称错误。 - 字段引用错误:代码中引用的
ID2字段在实际数据集中不存在,右侧匹配条目的ID列名就是ID;且函数内打印字段时混用df2和原始df,取值逻辑混乱。 - 匹配逻辑缺失:每遍历一行左侧主条目,就全量遍历所有右侧匹配条目打印,没有做关联匹配,导致所有右侧条目被重复打印(重复次数等于数据集总行数),完全没有实现归组效果。
修正实现代码
不需要写无意义的嵌套循环,基于pandas做拆分、去重、按关联ID拼接即可,运行效率和结果准确性都远高于逐行遍历:
import pandas as pd # 读取原始数据 df = pd.read_csv('file.csv') # 拆分左侧主条目表,统一列名 left_cols = ['ID1', 'Name1', 'Country1', 'Address1'] left_df = df[left_cols].rename(columns={ 'ID1': 'ID', 'Name1': 'Name', 'Country1': 'Country', 'Address1': 'Address' }) # 主条目去重,比如ID=58的主条目重复出现4次,仅保留1条 left_df = left_df.drop_duplicates(subset=['ID']).reset_index(drop=True) # 拆分右侧匹配条目表,统一列名 right_cols = ['ID', 'Name2', 'Country2', 'Address2', 'Score', 'City_Score'] right_df = df[right_cols].rename(columns={ 'Name2': 'Name', 'Country2': 'Country', 'Address2': 'Address' }).reset_index(drop=True) # 按主条目归并,主条目在前,对应的所有匹配条目紧随其后 merge_result = [] for _, main_row in left_df.iterrows(): # 写入当前主条目 merge_result.append(main_row.to_dict()) # 筛选当前主条目关联的所有匹配条目 related_match = df[df['ID1'] == main_row['ID']].index match_rows = right_df.loc[related_match] for _, match_row in match_rows.iterrows(): merge_result.append(match_row.to_dict()) # 转为DataFrame格式 final_df = pd.DataFrame(merge_result) # 控制台打印验证,也可导出为csv文件 print(final_df) final_df.to_csv('merged_entity_result.csv', index=False, encoding='utf-8-sig')
运行后输出的结构和目标效果完全一致,不会出现重复打印、条目错配的问题。
内容的提问来源于stack exchange,提问作者Dazed26
相关产品推荐
相关产品推荐

