我有一个包含数百万数据的数据。假设这是名为mydataframe的数据文件
filename | #insert-1 | #insert-2 | #delete-1 | #delete-2
---------------------------------------------------------
A | 4 | 4 | 3 | 3
B | 3 | 5 | 2 | 2
C | 5 | 5 | 6 | 7
D | 2 | 2 | 3 | 3
E | 4 | 5 | 5 | 3
---------------------------------------------------------我需要根据插入或删除的不同数量将文件分开,然后将它们保存到名为CSV的新different.csv文件中。并将具有相同插入和删除数量的其余数据保存在名为CSV的单独same.csv文件中。换句话说,如果文件在#insert-1和#insert-2之间有不同的编号,或者#delete-1和#delete-2,那么将其保存在different.csv中,否则,将其保存在same.csv中。
预期结果:different.csv
filename | #insert-1 | #insert-2 | #delete-1 | #delete-2
---------------------------------------------------------
B | 3 | 5 | 2 | 2
C | 5 | 5 | 6 | 7
E | 4 | 5 | 5 | 3
---------------------------------------------------------same.csv
filename | #insert-1 | #insert-2 | #delete-1 | #delete-2
---------------------------------------------------------
A | 4 | 4 | 3 | 3
D | 2 | 2 | 3 | 3
---------------------------------------------------------到目前为止,这是我的代码:
df_different = []
df_same = []
for row in range(0, len(mydataframe)):
ins_1 = mydataframe.iloc[row][1]
ins_2 = mydataframe.iloc[row][2]
del_1 = mydataframe.iloc[row][3]
del_2 = mydataframe.iloc[row][4]
if (ins_1 != ins_2) or (del_1 != del_2):
df_different.append(mydataframe.iloc[row])
else:
df_same.append(mydataframe.iloc[row])
with open('different.csv','w') as diffcsv:
writers = csv.writer(diffcsv, delimiter=',')
writers.writerow(fields)
for item in df_different:
writers.writerow(item)
with open('same.csv','w') as diffcsv:
writers = csv.writer(diffcsv, delimiter=',')
writers.writerow(fields)
for item in df_same:
writers.writerow(item)实际上,代码运行良好,但是当数据集非常大(我有数百万个数据)时,需要很长时间(超过3个小时)才能执行。我的问题是,是否有办法使它更快。谢谢。
发布于 2018-07-04 13:20:31
避免对行进行迭代;这很慢。相反,将比较操作矢量化:
same_mask = (df["#insert-1"] == df["#insert-2"]) & (df["#delete-1"] == df["#delete-2"])
df.loc[same_mask].to_csv("same.csv", index=False)
df.loc[~same_mask].to_csv("different.csv", index=False)对于100万行的数据,这只需几秒钟。
发布于 2018-07-04 13:15:22
您可以做的一件简单的事情就是为open函数(buffering=64*1024*1024)提供足够大的缓冲区(64 do缓冲区)。
另一件事是对dataframe进行迭代--而不是对行号进行迭代,您可以使用iterate directly over rows,例如:
for index, row in mydataframe.iterrows():
ins_1 = row[1]
ins_2 = row[2]
del_1 = row[3]
del_2 = row[4]我希望它会快得多。
发布于 2018-07-04 13:23:01
直接使用数据帧查询:
Same_data框架:
same_dataframe = mydataframe[(mydataframe["insert1"] == mydataframe["insert2"]) & (mydataframe["delete1"] == mydataframe["delete2"])]不同的Dataframe
different_data = mydataframe[(mydataframe["insert1"] != mydataframe["insert2"]) | (mydataframe["delete1"] != mydataframe["delete2"])]我认为,它比迭代更快。
希望,会有帮助的。
https://stackoverflow.com/questions/51174506
复制相似问题