我有2个CSV文件。
File1.csv
Frame_Nr; Data1; Data2; Labeled
0 0 1 1
1 0 0 1
2 1 1 1
3 0 0 0
4 0 0 0
5 1 0 1
6 0 0 0
7 0 0 0
11 0 1 1
12 1 1 1
File2.csv
Frame_Nr; Data1; Data2; Labeled
0 0 0 0
1 0 0 0
2 0 0 0
3 0 0 0
4 0 0 0
5 0 0 0
6 0 0 0
7 0 0 0
8 0 0 0
9 0 0 0
10 0 0 0
我希望输出看起来像这样。并且应将 file2.csv 与文件 file1.csv 合并,如果有一些更改要替换为 file1.csv 中的数据,否则保留数据来自 file2.csv
预期的 output.csv
Frame_Nr; Data1; Data2; Labeled
0 0 1 1
1 0 0 1
2 1 1 1
3 0 0 0
4 0 0 0
5 1 0 1
6 0 0 0
7 0 0 0
8 0 0 0
9 0 0 0
10 0 0 0
11 0 1 1
12 1 1 1
我的代码:
import csv
import os
f = open('file2', 'r')
reader = csv.reader(f, delimiter=';')
reader = list(reader)
f1 = open('file1', 'r')
reader1 = csv.reader(f1, delimiter=';')
next(reader1)
reader1 = list(reader1)
for line1 in reader1:
for line in reader:
if line1[0] != line[0]:
print(line1)
else:
print(line)
答案 0 :(得分:2)
Pandas具有两个非常好的功能,可以帮助您避免嵌套的for循环并提高处理效率:
import pandas as pd
df1 = pd.read_csv('file1.csv', options='whatever makes your csvs load')
df2 = pd.read_csv('file2.csv', options='whatever makes your csvs load')
df = pd.concat([df1, df2]).drop_duplicates('Frame_Nr')
(可选)如果希望将结果DataFrame
按Frame_Nr
排序,请将.sort_values('Frame_Nr')
链接到最后一行
要说明代码段,请执行以下操作:pd.concat
连接两个DataFrame,以便首先拥有文件1中的所有行,然后拥有文件2中的所有行,之后的drop_duplicates
将删除所有具有重复值的行在Frame_Nr
中保持第一。由于file1
是串联中的第一个文件,因此将保留该文件中的所有行,并且仅保留file2
中的行,如果它们的帧号不在file1
中。或者,sort_values
将按帧号列对DataFrame进行排序
答案 1 :(得分:2)
import pandas as pd
df1 = pd.read_csv("file1.csv", delim_whitespace=True)
df2 = pd.read_csv("file2.csv", delim_whitespace=True)
df=pd.concat([df1, df2]).drop_duplicates('Frame_Nr;').sort_values("Frame_Nr;")