【问题标题】:Get duplicated rows in larger-than-memory dataset with pandas [duplicate]使用 pandas 在大于内存的数据集中获取重复的行 [重复]
【发布时间】:2017-07-05 18:39:29
【问题描述】:

pandas.dataframe.duplicated 非常适合在数据框中的指定列中查找重复行。

但是,我的数据集比内存中的容量大(甚至比在合理的预算限制内扩展后我能适应的还要大)。

这对于我必须执行的大多数分析来说都很好,因为我可以遍历我的数据集(csv 和 dbf 文件),将每个文件单独加载到内存中并按顺序执行所有操作。但是,关于重复分析,这显然不适合在整个数据集中查找重复项,而仅适用于单个文件中。

是否有任何算法或方法可以跨多个数据帧查找重复项,而不必同时将它们全部加载到内存中?

【问题讨论】:

  • 如何散列行的值并查找重复的散列值?
  • 我不明白“GETTING”重复行,正如这个问题所问的,与“DROPPING”重复行一样,正如标记为重复的问题所问的那样

标签: python pandas duplicates large-data


【解决方案1】:

您可以对“键”列的值进行哈希处理,并维护一组您已经遇到的哈希码:

import hashlib

hash_set = set()  # this will contain all the hash codes of rows seen

def is_duplicate(row):
    m = hashlib.md5()
    for c in ["column1", "column2", "column3"]:
        m.update(row[c])
    hash_code = m.digest()
    if hash_code in hash_set:
        return 1
    hash_set.add(hash_code)
    return 0

for df_path in [df1_path, df2_path, df3_path]:  # iterate dataframes 1 by 1
    df = pd.read_csv(df_path)  # load the dataframe
    df["duplicate"] = df.apply(is_duplicate, axis=1)
    unique_df = df[df["duplicate"]==0]  # a "globaly" unique dataframe
    unique_df.pop("duplicate")  # you don't need this column anymore
    # YOUR CODE...

【讨论】:

    【解决方案2】:

    我会建议两件事。 首先是尽可能将数据帧加载到 rdbms 中。 然后您可以通过对关键列进行分组来查找重复项。

    其次,只从大文件中提取关键列并相互比较。

    尝试对文件中关键列的行进行排序,这样您就可以通过仅将一行与下一行进行比较来检测重复。

    希望对您有所帮助。

    【讨论】:

    • 排序是一个“查找重复”问题,仅当您的数据之前已排序时才是一个很好的建议
    猜你喜欢
    • 2020-08-20
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2023-01-25
    • 2014-06-02
    • 2022-06-24
    • 2017-01-14
    相关资源
    最近更新 更多