在python中获取2个数据帧之间的差异数

2024-10-01 17:38:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用python比较两个数据帧(两个数据帧中的行数和列数相同),并得到差异的数量,最好的方法是什么?在

def numberOfDifferencess(df1, df2):
    if df1.equals(df2):
        numberOfDifferences = 0
    else:
        ?????

Tags: 数据方法数量ifdef差异elsedf1
3条回答

有一种方法:

df
    a    b
0   1  999
1   2    3
2   3  345
3  56    8
4   7   54
df_b
    a    b
0   1  111
1   2    3
2   3  345
3  56    8
4   7   54

比较:

^{pr2}$

在函数中:

def numberOfDifferencess(df1, df2):
    return df1.count().sum() - (df1 == df2).astype(int).sum().sum()

本质上,(df == df_b).astype(int).sum().sum()将汇总两个数据帧之间的重叠(一个字段中的字段等于另一个数据帧中的字段)。在

快速测试

df1 = pd.DataFrame(np.random.randint(0, 100, size = (1000,1000)))
df2 = pd.DataFrame(np.random.randint(0, 100, size = (1000,1000)))

%timeit numberOfDifferencess(df1, df2)
%timeit number_of_diff(df1, df2) # using spies006 function for comparison (see below)

10 loops, best of 3: 20.6 ms per loop
1 loop, best of 3: 428 ms per loop

毫不奇怪,这种方法是理想的。迭代数据帧通常不是最有效的方法。在

>>> df1
   a  b
0  1  1
1  2  2
2  3  4


>>> df2
   a  b
0  1  1
1  2  2
2  8  4

这里有一个方法,我只是在你已有的基础上建立起来的。我使用loc来迭代df1和{}中的每一行。在

^{pr2}$

如果你想把它作为一个隐含的函数,它如下所示。在

def number_of_diff(df1, df2):
    differences = 0
    for i in range(len(df1)):
        if not df1.loc[i, :].equals(df2.loc[i, :]):
            differences += 1
    return differences

您可以使用底层的ndarrays功能来完成以下操作:

from pandas import DataFrame

df = DataFrame(data=[
    [1, 2, 3, 4],
    [6, 7, 8, 4],
    [1, 2, 3, 2]])

dfd = DataFrame(data=[
    [1, 2, 1, 4],
    [6, 9, 8, 4],
    [1, 1, 3, 2]])

diff = df.values != dfd.values

result = diff.flatten().sum()

相关问题 更多 >

    热门问题