使用pandas/python合并两个csv文件

5

我有两个csv文件,想要将它们合并为左连接...我的关键列是"id",在两个csv文件中都有相同的非关键列"result",但如果第二个CSV文件中存在任何值,则希望覆盖"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,

output.csv:

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

Expected Output

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 代码可以接受? - Inian
3个回答

2

请尝试这个方法,它同样有效。

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']) - Madhu
@Madhura Mhatre 好的...你得到了想要的结果,对吧? - Mahesh

1
您也可以像下面这样使用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以避免一些警告。

1
这将按需合并列:
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接