我有两个csv文件(假设CSV-1.csv和CSV-2.csv),每个文件包含超过一万个数据。这两个文件有两个相同的列,即'filename‘和’number_of_change‘。我的目的是根据文件名比较这两个文件。如果CSV-1中的文件名也在CSV-2中,则检查"number_of_changes“列。如果这两个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 | 15CSV-2.csv
filename | number_of_changes
A | 20
B | 15
D | 30
E | 10我需要从上面的两个文件创建新的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文件中的文件。此外,当数据非常大时,一个缺点是需要很长时间。那么,有没有更快更好的算法呢?请提出您的建议。谢谢。
发布于 2018-02-27 17:30:21
你需要这样的东西
df1 = pd.read_csv('CSV-1.csv')
df2 = pd.read_csv('CSV-2.csv')合并两个数据帧
df3 = df1.merge(df2, on="filename", how="outer",suffixes=('-1', '-2'))删除更改次数相同的行
df3 = df3[df3['number_of_changes-1'] != df3['number_of_changes-2']]用0填充NAs并按文件名排序
df3.fillna(0, inplace=True)
df3 = df3.sort_values(by ='filename').reset_index(drop=True)输出:
filename number_of_changes-1 number_of_changes-2
0 B 10.0 15.0
1 C 10.0 0.0
2 D 0.0 30.0
3 E 5.0 10.0
4 F 15.0 0.0发布于 2018-02-27 17:16:49
确实有一种更简单的方法--将数据帧放入merge中。基本上是这样的:
df1 = pd.read_csv("CSV-1.csv")
df2 = pd.read_csv("CSV-2.csv")
df3 = df1.merge(df2, on="filename", how="left")
df3.fillna(0, inplace=True)
# df3 would contain the following dataframe
###########
# filename number_of_changes_x number_of_changes_y
# 0 A 20 20.0
# 1 B 10 15.0
# 2 C 10 0.0
# 3 E 5 10.0
# 4 F 15 0.0基本上将两个数据帧合并为一个,并用0填充np.NaN值。根据您的需要,您可能需要将第二列转换为int。另外,如果需要更改列名,请使用rename方法。
https://stackoverflow.com/questions/49004624
复制相似问题