我想使用python比较两个数据帧(两者中的行数和列数相同)并获得差异数量,最好的方法是什么?
def numberOfDifferencess(df1, df2):
if df1.equals(df2):
numberOfDifferences = 0
else:
?????
答案 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
来迭代df1
和df2
中的每一行。
>>> 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()