2017-05-30 30 views
1

我想使用python比较两个数据框(两者中的行数和列数相同)并获得差异数,那么最好的办法是什么?获取python中2个数据框之间的差异数

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

回答

1

这里有一种方法:

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()将总结重叠(在一个平等场在anoth的领域呃)在两个数据框之间。

快速速度测试

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 

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

+0

感谢安德鲁l在得到的乔布为我做的:) – Krasig

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()