You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批量导入本地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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:32:08