我想使用python比较两个数据框(两者中的行数和列数相同)并获得差异数,那么最好的办法是什么?获取python中2个数据框之间的差异数
def numberOfDifferencess(df1, df2):
if df1.equals(df2):
numberOfDifferences = 0
else:
?????
我想使用python比较两个数据框(两者中的行数和列数相同)并获得差异数,那么最好的办法是什么?获取python中2个数据框之间的差异数
def numberOfDifferencess(df1, df2):
if df1.equals(df2):
numberOfDifferences = 0
else:
?????
这里有一种方法:
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
毫不奇怪,这种做法是理想的。迭代数据帧通常不是最有效的方法。
>>> 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
您可以使用此底层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()
感谢安德鲁l在得到的乔布为我做的:) – Krasig