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

时间:2017-05-30 15:14:47

标签: python pandas numpy dataframe comparison

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

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

3 个答案:

答案 0 :(得分: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()将总结两个数据帧之间的重叠(另一个等于另一个字段中的字段)。

快速测试

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 :(得分: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

答案 2 :(得分: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()