【发布时间】:2018-02-27 08:53:00
【问题描述】:
我有 2 个 csv 文件(假设为 CSV-1.csv 和 CSV-2.csv),每个文件包含一万多个数据。这 2 个文件有 2 个相同的列,即 'filename' 和 'number_of_changes'。我的目的是根据文件名比较这两个文件。如果 CSV-1 中的文件名也在 CSV-2 中,则检查“number_of_changes”列。如果这 2 个 csv 文件之间具有相同文件名的更改数量不同,则将此数据存储在具有 3 列的新 csv 文件中(假设 New_CSV.csv)。但是如果这两个文件中的文件名和 number_of_changes 相同,则传递它(不要存储在新的 csv 中)。 假设我的 CSV 文件:
CSV-1.csv
filename | number_of_changes
---------------------------------
A | 20
B | 10
C | 10
E | 5
F | 15
CSV-2.csv
filename | number_of_changes
A | 20
B | 15
D | 30
E | 10
我需要从上面的 2 个文件中创建新的 csv 文件 (New_CSV.csv):
filename | number_of_changes-1 | number_of_changes-2
----------------------------------------------------------
B | 10 | 15
C | 10 | 0
D | 0 | 30
E | 5 | 10
F | 15 | 0
到目前为止,我已经编写了代码:
import pandas as pd
cols = ['filename','number_of_changes']
data1 = pd.read_csv('CSV-1.csv')
data2 = pd.read_csv('CSV-2.csv')
df1 = data1[cols]
df2 = data2[cols]
lshist = []
for x in range(0,len(df1)-1):
lshist.append(list(df1.iloc[x]))
lsmyers = []
for y in range(0,len(df2)-1):
lsmyers.append(list(df2.iloc[y]))
with open('New_CSV.csv', 'w') as csvfile:
header = ['filename', 'number_of_changes-1', 'number_of_changes-2']
writers = csv.writer(csvfile, delimiter=',')
writers.writerow(header)
for fn in range(1,len(lshist)-1):
tmp = []
fnhist = lshist[fn][0]
for x in range(0,len(lsmyers)-1):
sys.stdout.write('\rSearching in myers : %i' % (x+1) + ' out of %i' % (len(lsmyers)-1) + ' in % i' % (fn) + ' out of %i' % (len(lshist)-1) + ' in histogram')
sys.stdout.flush()
if fnhist != lsmyers[x][0]:
pass
else:
if lshist[fn][1] == lsmyers[x][1]:
pass
else:
tmp = [fnhist,lshist[fn][1],lsmyers[x][1]]
writers.writerow(tmp)
当我运行代码时,它仅适用于两个 CSV 文件中的文件。但它不适用于不在其他 CSV 文件中的文件。此外,一个缺点是当数据非常大时需要很长时间。那么,有没有更快更好的算法呢?请你的建议。谢谢。
【问题讨论】: