使用pandas / python组合/合并两个csv

时间:2017-01-16 04:09:10

标签: python csv pandas

我有两个csvs,我想将这些csvs合并或合并为left join ... 我的键列是“id”,我在两个csvs中都有与“result”相同的非键列,但是如果第二个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,

output.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)

问题:

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

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

试试这个,这也适用

UIAlertActionStyleDestructive

答案 2 :(得分:0)

您还可以如下使用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是为了避免某些警告