Python&Pandas基于字符串匹配合并CSV文件的实现方法咨询
解决方案
问题原因分析
- 直接对Pandas Series对象调用
str(),得到的是整个列的打印摘要字符串,不是逐行的字段值,匹配逻辑自然不成立 Series.str.contains()不支持传入列表作为匹配参数,且你没有遍历花名册的每一行做对应匹配,逻辑存在缺失- 未统一字段类型,比如数字型的user_id和字符串型的user_id无法匹配,也会导致匹配结果始终为False
实现方案
方案1:提取user_id关联(推荐,匹配准确率最高)
你的文件名规则为{first_name}{last_name}_{user_id}_{其他内容},可以直接提取唯一标识user_id作为关联主键,效率最高:
import pandas as pd import os # 读取文件 file_df = pd.read_csv('filedata.csv') roster_df = pd.read_csv('roster.csv') # 从文件路径中提取user_id,统一转为字符串避免类型不匹配 file_df['user_id'] = file_df['filename'].apply( lambda x: os.path.basename(x).split('_')[1] ).astype(str) roster_df['user_id'] = roster_df['user_id'].astype(str) # 按user_id关联两个表 result_df = pd.merge(file_df, roster_df, on='user_id', how='left') # 输出结果 result_df.to_csv('filedata_updated.csv', index=False, encoding='utf-8-sig')
方案2:字符串模糊匹配(适合文件名规则不固定的场景)
如果不能直接提取user_id,可以拼接匹配关键词逐行匹配:
import pandas as pd file_df = pd.read_csv('filedata.csv') roster_df = pd.read_csv('roster.csv') # 拼接匹配关键词 roster_df['match_key'] = roster_df['first_name'] + roster_df['last_name'] + '_' + roster_df['user_id'].astype(str) result_df = file_df.copy() # 遍历花名册逐行匹配 for _, row in roster_df.iterrows(): match_mask = result_df['filename'].str.contains(row['match_key'], case=False) result_df.loc[match_mask, ['first_name', 'last_name', 'user_id']] = row[['first_name', 'last_name', 'user_id']].values result_df.to_csv('filedata_updated.csv', index=False, encoding='utf-8-sig')
运行后生成的filedata_updated.csv就是你需要的目标结构,匹配不到的行对应字段会留空,方便后续排查异常。
内容的提问来源于stack exchange,提问作者Daniel Hutchinson
相关产品推荐
相关产品推荐

