有没有更快的方法使用python从CSV中分离重复和不同的数据?

Yus*_*UMS 4 python csv duplicates dataframe pandas

我有一个包含数百万数据的数据帧.假设这是名为的数据帧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
---------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我需要根据插入或删除的不同数量来分离文件,然后将它们保存到新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
---------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

same.csv

filename | #insert-1 | #insert-2 | #delete-1 | #delete-2
---------------------------------------------------------
A        |         4 |         4 |         3 |         3
D        |         2 |         2 |         3 |         3
---------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

到目前为止这是我的代码:

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)
Run Code Online (Sandbox Code Playgroud)

实际上,代码运行良好,但是当数据集非常大(我有数百万个数据)时,执行需要很长时间(超过3个小时).我的问题是,是否有一种方法可以加快速度.谢谢.

DSM*_*DSM 6

避免迭代行; 这很慢.相反,矢量化比较操作:

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)
Run Code Online (Sandbox Code Playgroud)

对于1M行的数据帧,这只需要几秒钟.