首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有更快的方法使用python将重复和不同的数据从CSV中分离出来?

是否有更快的方法使用python将重复和不同的数据从CSV中分离出来?
EN

Stack Overflow用户
提问于 2018-07-04 13:08:43
回答 3查看 227关注 0票数 4

我有一个包含数百万数据的数据。假设这是名为mydataframe的数据文件

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
filename | #insert-1 | #insert-2 | #delete-1 | #delete-2
---------------------------------------------------------
A        |         4 |         4 |         3 |         3
D        |         2 |         2 |         3 |         3
---------------------------------------------------------

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

代码语言:javascript
复制
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个小时)才能执行。我的问题是,是否有办法使它更快。谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-04 13:20:31

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

代码语言:javascript
复制
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万行的数据,这只需几秒钟。

票数 6
EN

Stack Overflow用户

发布于 2018-07-04 13:15:22

您可以做的一件简单的事情就是为open函数(buffering=64*1024*1024)提供足够大的缓冲区(64 do缓冲区)。

另一件事是对dataframe进行迭代--而不是对行号进行迭代,您可以使用iterate directly over rows,例如:

代码语言:javascript
复制
for index, row in mydataframe.iterrows():
    ins_1 = row[1]
    ins_2 = row[2]
    del_1 = row[3]
    del_2 = row[4]

我希望它会快得多。

票数 3
EN

Stack Overflow用户

发布于 2018-07-04 13:23:01

直接使用数据帧查询:

Same_data框架:

代码语言:javascript
复制
same_dataframe = mydataframe[(mydataframe["insert1"] == mydataframe["insert2"]) & (mydataframe["delete1"] == mydataframe["delete2"])]

不同的Dataframe

代码语言:javascript
复制
different_data = mydataframe[(mydataframe["insert1"] != mydataframe["insert2"]) | (mydataframe["delete1"] != mydataframe["delete2"])]

我认为,它比迭代更快。

希望,会有帮助的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51174506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档