我有一些满是Pandas 数据帧的列表.这是一种从中删除重复项的方法.下面是一些示例代码:

import pandas as pd
import numpy as np

if __name__ == '__main__':
    data1 = {'row_1': [3, 2, 1, 0], 'row_2': ['a', 'b', 'c', 'd']}
    
    df1 = pd.DataFrame.from_dict(data1, orient='index', columns=['A', 'B', 'C', 'D'])
    data2 = {'col_1': [3, 2, 1, 0], 'col_2': ['a', 'b', 'c', 'd']}

    df2 = pd.DataFrame.from_dict(data2)
    df3 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
                   columns=['a', 'b', 'c'])
    data = np.array([(1, 2, 3), (4, 5, 6), (7, 8, 9)],

                dtype=[("a", "i4"), ("b", "i4"), ("c", "i4")])

    df4 = pd.DataFrame(data, columns=['c', 'a'])

    l_input = [df1, df2, df1, df3, df4, df4, df1, df3]
    # l_aim = [df1, df2, df3, df4]

示例中的输入列表l_input应该删除,l_aim应该是结果.

推荐答案

在线性时间内找到重复项的一种有效方法是计算数据帧的散列.你不能用Pythonhash函数来实现,但是pandas:pandas.util.hash_pandas_object中有一个helper函数.

该函数计算每行的哈希值,因此需要将其聚合为单个值.可以使用sum,但可能会导致碰撞.在这里,我 Select 了所有散列的串联.如果您有巨大的数据帧,这可能会消耗大量内存(在这种情况下,可能会对哈希列表进行哈希).

100 The hash of hashes seems to be ideal, see the second option at the end of the answer.

hashes = [pd.util.hash_pandas_object(d).astype(str).str.cat(sep='-')
          for d in l_input]

# identify duplicated per index
dups = pd.Series(hashes).duplicated()

输出:

0    False
1    False
2     True
3    False
4    False
5     True
6     True
7     True
dtype: bool

要过滤唯一的数据帧,请执行以下操作:

out = [d for d,h in zip(l_input, dups) if h]

variant with a hash of the hashes

我最初不确定计算哈希列表的哈希值是否安全,但是this seems to be the case,因此下面的第二种方法可能更可取:

def df_hash(df):
    s = pd.util.hash_pandas_object(df)
    return hash(tuple(s))

hashes = [df_hash(d) for d in l_input]

dups = pd.Series(hashes).duplicated()

out = [d for d,h in zip(l_input, dups) if h] 

Python相关问答推荐

PyTorch卷积自动编码器,输出维度与输入不同

已删除的构造函数调用另一个构造函数

如何使用bs 4从元素中提取文本

添加包含中具有任何值的其他列的计数的列

Python Hashicorp Vault库hvac创建新的秘密版本,但从先前版本中删除了密钥

Python 3.12中的通用[T]类方法隐式类型检索

非常奇怪:tzLocal.get_Localzone()基于python3别名的不同输出?

用Python解密Java加密文件

如何在虚拟Python环境中运行Python程序?

为什么sys.exit()不能与subproccess.run()或subprocess.call()一起使用

如何在python polars中停止otherate(),当使用when()表达式时?

如何调整QscrollArea以正确显示内部正在变化的Qgridlayout?

在Python中动态计算范围

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

计算天数

如何使用SentenceTransformers创建矢量嵌入?

在两极中过滤

提高算法效率的策略?

如何在Python请求中组合多个适配器?

Django Table—如果项目是唯一的,则单行