如何用Shell脚本按列名读取CSV并基于主键合并多文件
处理多CSV文件的列读取与关联查询方案
嘿,我来帮你搞定这个多CSV合并和关联的需求!下面我会一步步拆解,从按列读取数据开始,到实现一对一、一对多的关联查询,用Python的pandas库就能轻松完成。
一、按列名读取指定数据
首先,咱们先搞定按列读取的问题。pandas的read_csv()方法支持直接指定要读取的列,不用加载整个文件,效率更高。
操作步骤:
- 先导入pandas库:
import pandas as pd
- 针对每个CSV文件,用
usecols参数指定要读取的列,同时注意统一主键列名(你的文件主键名不一致:H1、SASH1、SPLI等,统一成同一个名字比如H1,后续关联会更方便):
# 读取CSV1:只取H1、Name、DOB列,主键名已经是H1,不用改 df1 = pd.read_csv('CSV1.csv', usecols=['H1', 'Name', 'DOB']) # 读取CSV2:取SASH1(主键)、Auth#、State、Status列,把主键名改成H1 df2 = pd.read_csv('CSV2.csv', usecols=['SASH1', 'Auth#', 'State', 'Status']).rename(columns={'SASH1': 'H1'}) # 读取CSV3:取SPLI(主键)、RequestedFromDate、Type、ServiceType列,主键改名为H1 df3 = pd.read_csv('CSV3.csv', usecols=['SPLI', 'RequestedFromDate', 'Type', 'ServiceType']).rename(columns={'SPLI': 'H1'}) # 读取CSV4:你提到有CRLI和ARLI两个数据集,假设它们是同结构的不同表,分别读取并重命名主键 df_crli = pd.read_csv('CSV4.csv', usecols=['CRLI', 'DateofReview', 'ReviewedBy', 'CriteriaMet']).rename(columns={'CRLI': 'H1'}) df_arli = pd.read_csv('CSV4.csv', usecols=['ARLI', 'DateofReview', 'CriteriaMet', 'CriteriaSource']).rename(columns={'ARLI': 'H1'})
二、实现类似Access的关联查询
接下来是核心的关联部分,pandas的merge()方法可以完美模拟Access的表关联,支持一对一、一对多场景。
1. 一对一关联(比如CSV1和CSV2)
如果CSV2中每个主键H1只有一条记录,那就是一对一关联。我们可以用左连接(保留CSV1的所有记录,匹配CSV2的对应记录)或者内连接(只保留两边都有匹配的记录):
# 左连接:保留df1的所有记录,匹配df2的对应数据 merged_one_to_one = pd.merge(df1, df2, on='H1', how='left') # 如果是内连接,只保留两边都有匹配的记录,把how改成'inner'即可 # merged_one_to_one = pd.merge(df1, df2, on='H1', how='inner')
输出的结果里,每条H1对应一条CSV2的记录,和你示例里的“一对一”场景一致。
2. 一对多关联(比如CSV1和CSV3)
如果CSV3中一个H1对应多条记录,pandas的merge会自动处理这种一对多的情况,生成多条匹配的记录:
# 左连接:保留df1的所有记录,匹配df3的所有对应记录 merged_one_to_many = pd.merge(df1, df3, on='H1', how='left')
这样输出的结果里,一个H1会对应CSV3里的多条记录,和你示例里的“一对多”场景完全匹配。
3. 合并多表(同时包含一对一和一对多数据)
如果你想把所有关联的数据整合到一个结果里,可以分步合并:
# 先合并一对一的df1和df2 combined = pd.merge(df1, df2, on='H1', how='left') # 再合并一对多的df3,此时会自动展开多条记录 combined = pd.merge(combined, df3, on='H1', how='left') # 如果需要加入CSV4的CRLI或ARLI数据,继续merge即可 combined = pd.merge(combined, df_crli, on='H1', how='left')
三、导出最终结果
最后把合并好的数据导出成CSV文件,格式就和你期望的一致了:
combined.to_csv('merged_result.csv', index=False)
关键细节提醒:
- 主键一定要统一命名,否则merge会找不到关联键;
- 选择合适的连接方式(how参数):
left保留左表所有记录,inner只保留匹配记录,outer保留所有记录; - 如果CSV4里的CRLI和ARLI是不同类型的记录,你可以选择分别合并,或者先把它们纵向合并(用
pd.concat())再和主表关联。
内容的提问来源于stack exchange,提问作者sillyrabiit
相关产品推荐
相关产品推荐

