【问题标题】:combine/merge two csv using pandas/python使用 pandas/python 组合/合并两个 csv
【发布时间】:2026-02-13 20:15:02
【问题描述】:

我有两个 csv,我想将这些 csv 合并或合并为左连接... 我的键列是“id”,我在两个 csv 中都有与“result”相同的非键列,但是如果 2nd CSV 的“result”列中存在任何值,我想覆盖“result”列。如何使用 pandas 或任何脚本语言来实现这一点。请查看我的最终预期输出。

输入

input.csv:

id,scenario,data1,data2,result
1,s1,300,400,"{s1,not added}"
2,s2,500,101,"{s2 added}"
3,s3,600,202,

输出.csv:

id,result
1,"{s1,added}"
3,"{s3,added}"

预期输出

final_output.csv

id,scenario,data1,data2,result
1,s1,300,400,"{s1,added}"
2,s2,500,101,"{s2 added}"
3,s3,600,202,"{s3,added}"

当前代码:

import pandas as pd

a = pd.read_csv("input.csv")
b = pd.read_csv("output.csv")
merged = a.merge(b, on='test_id',how='left')
merged.to_csv("final_output.csv", index=False)

问题:

使用此代码,我得到了两次结果列。我只想要一次,如果该列中存在值,它应该覆盖。如何获得单个结果列?

【问题讨论】:

  • 您想要python 中的这个或awk 中的代码是否可以接受?

标签: python csv pandas


【解决方案1】:

试试这个,效果也不错

import pandas as pd
import numpy as np
c=pd.merge(a,b,on='id',how='left')
lst=[]
for i in c.index:
    if(c.iloc[i]['result_x']!=''):
         lst.append(c.iloc[i]['result_x'])
    else:
         lst.append(c.iloc[i]['result_y'])
c['result']=pd.Series(lst)
del c['result_x']
del c['result_y']

【讨论】:

  • 嘿@Mahesh,我修改了一点代码......因为我想要来自正确的csv“结果列”的所有数据(如果存在)。 for i in c.index: if(pd.isnull(c.iloc[i]['result_y'])): lst.append(c.iloc[i]['result_x']) else: lst.append(c.iloc[i]['result_y'])
  • @Madhura Mhatre 好的...你得到了想要的结果,对吗?
【解决方案2】:

这将根据需要组合列:

import pandas as pd

a = pd.read_csv("input.csv")
b = pd.read_csv("output.csv")
merged = a.merge(b, on='id', how='outer')

def merge_results(row):
    y = row['result_y']
    return row['result_x'] if isinstance(y, float) else y

merged['result'] = merged.apply(merge_results, axis=1)
del merged['result_x']
del merged['result_y']

merged.to_csv("final_output.csv", index=False)

【讨论】:

    【解决方案3】:

    您也可以使用concat,如下所示。

    import pandas as pd
    
    a = pd.read_csv("input.csv")
    b = pd.read_csv("output.csv")
    frames=[a,b]
    mergedFrames=pd.DataFrame()
    mergedFrames=pd.concat(frames, sort=True)
    mergedFrames.to_csv(path/to/location)
    

    注意:添加 sort=True 是为了避免一些警告

    【讨论】: