使用Python对比两个CSV文件并为df_g新增匹配Price列的技术咨询
解决CSV匹配新增列的问题
我来帮你搞定这个匹配列的需求!先说说你原来代码的问题:直接用df_g['Sitio'] == df['Sitio']这种方式做判断,在pandas里是对整个列(Series)做逐元素比较,返回的是一堆布尔值,没法直接放在if条件里用;而且如果两个DataFrame的行数不一样,还会触发广播错误,这种逐行判断的思路在pandas里完全没必要,用merge关联才是正确的姿势。
你找到的merge方案方向是对的,但需要补全匹配的关键参数,避免潜在的错误,这里给你优化后的完整代码:
import pandas as pd # 读取两个CSV文件 df = pd.read_csv('test2.csv') df_g = pd.read_csv('test_hecho.csv') # 基于Sitio和Country两列做左连接,只保留需要的Price列 # 提前筛选df的列能减少数据量,提升匹配效率 merged_result = df_g.merge( df[['Sitio', 'Country', 'Price']], # 只取df中需要参与匹配和赋值的列 on=['Sitio', 'Country'], # 明确指定匹配的键列,避免同名列干扰 how='left' # 左连接保证df_g的所有行都保留,匹配不到的会填充NaN ) # 把匹配到的Price赋值给df_g的新列Bidfloor df_g['Bidfloor'] = merged_result['Price'] # 保存结果到新CSV,index=False避免保存索引列 df_g.to_csv('aaa.csv', index=False)
为啥这么写更靠谱:
- 明确匹配键:用
on参数指定Sitio和Country作为匹配依据,不会因为两个DataFrame有其他同名列导致匹配出错 - 左连接保留原数据:
how='left'确保df_g里的每一行都能保留,哪怕在df里找不到对应匹配的行,这时候Bidfloor会填充NaN,符合你的需求 - 性能更优:pandas的
merge是基于向量运算实现的,比你想的逐行读取判断效率高得多,尤其是数据量大的时候差距会很明显
内容的提问来源于stack exchange,提问作者user9371527
相关产品推荐
相关产品推荐

