【发布时间】:2021-02-11 10:19:07
【问题描述】:
我一直在尝试比较两个数据框以查找缺失的行和不同的行:
案例1:行数相同,行数不同:
在这种情况下,我的行数相同,但有两个不同的行:
dict_a = {'Values 1':[15, 2, 3, 24, 5, 16], 'Values 2':[10, 7, 3, 5, 6, 23],
'Values 3': ["Apple", "Orange", "Kiwi", "Cherry", "Banana", "Grapes"]}
dict_b = {'Values 1':[15, 3, 3, 24, 5, 16], 'Values 2':[10, 7, 3, 5, 6, 23],
'Values 3': ["Apple", "Orange", "Kiwi", "Cherry", "Banana", "Grape"]}
df1 = pd.DataFrame(dict_a)
df2 = pd.DataFrame(dict_b)
所以,我可以使用以下方法找到不同的行索引:
list(df1[~df1.isin(df2)].dropna(how = 'all').index)
这导致[1, 5]。
案例2:行数不同,行数不同:
在这种情况下,我有不同的行数和两个不同的行。
dict_a = {'Values 1':[15, 2, 3, 24, 1], 'Values 2':[10, 7, 3, 5, 6],
'Values 3': ["Apple", "Orange", "Kiwi", "Cherry", "Banana"]}
dict_b = {'Values 1':[15, 1, 3, 24, 5, 16], 'Values 2':[10, 7, 3, 5, 6, 23],
'Values 3': ["Apple", "Orange", "Kiwi", "Cherry", "Banana", "Grape"]}
df1 = pd.DataFrame(dict_a)
df2 = pd.DataFrame(dict_b)
display(df1)
display(df2)
在这里,我首先检查缺失的行。由此,我可以通过比较长度较大的数据帧和较短的长度来发现它是第五个索引:
df2[~df2.index.isin(df1.index)]
我还可以找到不同的行:
df1[~df1.isin(df2)].dropna(how = 'all')
它们是[1, 4]。
案例 3:行互换,但行数据相同
dict_a = {'Values 1':[2, 15, 3, 24, 5, 16], 'Values 2':[7, 10, 3, 5, 6, 23],
'Values 3': ["Orange", "Apple", "Kiwi", "Cherry", "Banana", "Grape"]}
dict_b = {'Values 1':[15, 2, 3, 24, 5, 16], 'Values 2':[10, 7, 3, 5, 6, 23],
'Values 3': ["Apple", "Orange", "Kiwi", "Cherry", "Banana", "Grape"]}
df1 = pd.DataFrame(dict_a)
df2 = pd.DataFrame(dict_b)
display(df1)
display(df2)
但是,该代码不适用于互换的行。无论位置如何,它都需要检查行是否已经存在并返回结果“没有不同的行”,但它却说索引[0, 1] 处的行不同。
所以,我正在寻找一种解决方案,它可以比较两个数据帧,而不管行顺序或位置、缺失行和不同行。
所以,我的目标是比较两个数据框并返回“缺失的行”和“不同的行”,即它们彼此不完全匹配。有没有这样一个函数可以真正用这种方式比较行?
【问题讨论】:
-
有很多方法可以做到这一点,我认为在您的用例中,如果列对齐,请使用
pd.concat([df1,df2],keys['df1','df2'])然后您可以使用.drop_duplicates及其不同的参数来获得所需的行集(请参阅文档中的keep=False, keep='first',keep='last')。另一种可行的方法是根据某些字段创建一个唯一的哈希键,然后在该键上使用您的isin方法来查看增量。