批量导入本地CSV文件并按ACCESS_ID实现1:1内连接的问题求助
解决多CSV文件按共同列1:1合并的问题
这问题我之前处理多份用户数据时也碰到过!你之前用pd.concat()的思路偏了——它是行拼接,把所有数据按行堆在一起,自然会出现重复的ACCESS_ID和缺失值;而你要的是按共同列做列层面的1:1匹配合并,也就是类似SQL里的JOIN操作,这时候用pd.merge()配合functools.reduce()就能完美解决。
为什么你的原有代码不生效?
pd.concat([dfs,df])是将多个DataFrame的行堆叠起来,不管ACCESS_ID是否重复。如果不同CSV有不同的列,未匹配到的位置就会填充NA,完全不是你要的1:1合并效果。
正确的批量合并方案
步骤1:读取所有CSV到DataFrame列表
先把目标文件夹里的所有CSV文件读取成一个DataFrame列表,方便后续批量处理:
import pandas as pd import glob import os from functools import reduce # 切换到目标文件夹 os.chdir('C:/Users/xx/Downloads/merge/') # 一次性读取所有CSV到列表 df_list = [pd.read_csv(file) for file in glob.glob('*.csv')]
步骤2:用reduce批量合并所有DataFrame
reduce()函数可以帮你把列表里的DataFrame逐个按ACCESS_ID合并,最终得到一个统一的大DataFrame:
# 按ACCESS_ID做内连接(只保留所有CSV都存在的ACCESS_ID,严格1:1匹配) csvs_all = reduce(lambda left_df, right_df: pd.merge(left_df, right_df, on='ACCESS_ID'), df_list) # 如果你需要保留所有出现过的ACCESS_ID(即使某些CSV里没有该ID),可以用外连接: # csvs_all = reduce(lambda left_df, right_df: pd.merge(left_df, right_df, on='ACCESS_ID', how='outer'), df_list)
额外优化:处理同名列问题
如果不同CSV里有除了ACCESS_ID之外的同名列,merge后会自动添加_x/_y后缀区分。如果你想更清晰地标记来源,可以在读取时给列名加上文件名前缀:
df_list = [] for file in glob.glob('*.csv'): # 获取文件名(去掉.csv后缀) file_prefix = os.path.splitext(os.path.basename(file))[0] df = pd.read_csv(file) # 给非ACCESS_ID的列添加文件名前缀 df = df.rename(columns={col: f"{file_prefix}_{col}" for col in df.columns if col != 'ACCESS_ID'}) df_list.append(df) # 再执行合并 csvs_all = reduce(lambda left_df, right_df: pd.merge(left_df, right_df, on='ACCESS_ID'), df_list)
这样合并后的列名会像file1_col1、file2_col1,清晰区分不同文件的来源,避免混淆。
内容的提问来源于stack exchange,提问作者JodeCharger100
相关产品推荐
相关产品推荐

