在Python中获取两个数据框之间的差异数量

4
我希望您能用Python比较两个数据框(行数和列数相同),并获得不同之处的数量,您认为什么是最好的方法?
def numberOfDifferencess(df1, df2):
    if df1.equals(df2):
        numberOfDifferences = 0
    else:
        ?????
3个回答

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

比较:

df.count().sum() - (df == df_b).astype(int).sum().sum()
1 #this is the number of differences

在一个函数中:

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

毫不奇怪,这种方法是理想的。遍历数据框通常不是最有效的方法。


1
>>> 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 迭代遍历 df1df2 中的每一行。
>>> numberOfDifferences = 0
>>> for i in range(len(df1)):
...     if not df1.loc[i, :].equals(df2.loc[i, :]): 
...             numberOfDifferences+=1
... 
>>> numberOfDifferences
1

如果您希望将其作为函数来实现,如所暗示的那样,可以按照以下方式进行。
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

0
你可以使用底层的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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接