2017-05-30 73 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()