我有两个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)
使用此代码我将获得两次结果列。我只想要一次,如果该列中存在值,则应该覆盖它。如何获得单个结果列?
答案 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
是为了避免某些警告