如何基于共同EMP_ID列合并多个CSV文件(避免重复列)
解决多CSV按共同EMP_ID合并去重问题
问题说明
你有多个结构不同但都包含EMP_ID列的CSV文件,希望合并成一个包含所有列的文件,但使用pd.concat(axis=1)后出现EMP_ID重复的情况。
原始文件内容
文件1 (file_1.csv)
| EMP_ID | EMP_name | EMP_Service |
|---|---|---|
| 33 | a | 6 |
| 44 | b | 3 |
| 12 | c | 1 |
| 16 | d | 10 |
| 10 | e | 25 |
文件2 (file_2.csv)
| EMP_ID | EMP_age |
|---|---|
| 33 | 30 |
| 44 | 29 |
| 12 | 27 |
| 16 | 45 |
| 10 | 50 |
文件3 (file_3.csv)
| EMP_ID | EMP_dept |
|---|---|
| 33 | xyz |
| 44 | abc |
| 12 | lmn |
| 16 | abc |
| 10 | lmn |
期望输出 (cat_vars.csv)
| EMP_ID | EMP_name | EMP_age | EMP_Service | EMP_dept |
|---|---|---|---|---|
| 33 | a | 30 | 6 | xyz |
| 44 | b | 29 | 3 | abc |
| 12 | c | 27 | 1 | lmn |
| 16 | d | 45 | 10 | abc |
| 10 | e | 50 | 25 | lmn |
错误原因
你使用的pd.concat([df1, df2, df3], axis=1)是按列直接拼接,每个DataFrame都自带EMP_ID列,所以最终结果会出现多个重复的EMP_ID列。这种方法适用于列结构完全一致的DataFrame行拼接,或者列无重叠的列拼接,但不适合按共同键关联合并的场景。
正确解决方案
我们需要通过EMP_ID作为关联键,将多个DataFrame进行横向合并,可以用pd.merge方法,或者用functools.reduce批量合并多个文件:
方法1:逐次merge合并
import pandas as pd # 读取文件 df1 = pd.read_csv(r'file_1.csv') df2 = pd.read_csv(r'file_2.csv') df3 = pd.read_csv(r'file_3.csv') # 按EMP_ID合并,默认是内连接(保留所有匹配的行) merged_df = df1.merge(df2, on='EMP_ID').merge(df3, on='EMP_ID') # 保存结果 merged_df.to_csv('cat_vars.csv', index=False)
方法2:批量合并(适合更多文件的场景)
如果有更多CSV文件,可以用functools.reduce来批量合并,避免重复写merge:
import pandas as pd from functools import reduce import glob # 获取所有CSV文件路径 csv_files = glob.glob('file_*.csv') # 读取所有文件为DataFrame列表 df_list = [pd.read_csv(file) for file in csv_files] # 按EMP_ID批量合并所有DataFrame merged_df = reduce(lambda left, right: pd.merge(left, right, on='EMP_ID'), df_list) # 保存结果 merged_df.to_csv('cat_vars.csv', index=False)
说明
merge的on参数指定关联的共同列EMP_ID,默认是内连接(只保留所有文件中都存在的EMP_ID对应的行)。- 如果需要保留所有EMP_ID(即使某个文件中没有对应数据),可以添加
how='outer'参数,缺失值会用NaN填充。
内容的提问来源于stack exchange,提问作者Shourya
相关产品推荐
相关产品推荐

