使用Pandas实现两个CSV按EAN匹配更新指定列的相关问题
问题原因分析
- 第一个报错的触发原因:
dfi.EAN.values是pandas Series内置的数组属性,不属于可调用方法,你额外加了()才会抛出numpy.ndarray不可调用的错误。且即使去掉括号,直接对两个长度不同的数组做全等对比也不符合你的匹配逻辑,只能得到长度报错或者错位对比的错误结果。 - 你想到的合并方案方向是对的,不需要手动循环遍历行,pandas内置的匹配赋值效率更高。
实现代码
import pandas as pd csv_input = 'beschreibung.csv' csv_output = 'shop2.csv' # 读取两个文件,注意如果实际分隔符只有分号,建议把sep改为";"避免解析异常 dfi = pd.read_csv(csv_input, sep=";\t", usecols=['EAN', 'Beschreibung']) dfo = pd.read_csv(csv_output, sep=";\t", usecols=['ean', 'description_long']) # 左连接匹配:保留输出表的所有行,只给匹配到EAN的行更新描述 df_merged = dfo.merge(dfi, how='left', left_on='ean', right_on='EAN') # 用匹配到的Beschreibung覆盖description_long,没匹配到的保留原值 df_merged['description_long'] = df_merged['Beschreibung'].fillna(df_merged['description_long']) # 只保留输出表需要的列,删掉多余的匹配列 df_final = df_merged[['ean', 'description_long']] # 保存结果到新文件,避免覆盖原shop2.csv出错,验证没问题后可以修改路径覆盖原文件 df_final.to_csv('shop2_updated.csv', sep=';', index=False)
可选优化点
- 如果EAN/ean列有字符串/数值类型不一致的匹配失败问题,可以在匹配前统一类型:
dfi['EAN'] = dfi['EAN'].astype(str) dfo['ean'] = dfo['ean'].astype(str) - 如果确认不需要额外保留合并过程数据,可以直接用
map方法更简洁:# 建立EAN到Beschreibung的映射字典 ean_map = dfi.set_index('EAN')['Beschreibung'].to_dict() # 匹配赋值 dfo['description_long'] = dfo['ean'].map(ean_map).fillna(dfo['description_long'])
内容的提问来源于stack exchange,提问作者Finja
相关产品推荐
相关产品推荐

