查找两个数据框之间的差异

13 浏览
0 Comments

查找两个数据框之间的差异

我有两个数据框df1和df2,其中df2是df1的一个子集。如何获得一个新的数据框(df3),即两个数据框之间的差异?\n换句话说,一个包含df1中所有不在df2中的行/列的数据框?\n![图片描述](https://i.stack.imgur.com/aOCGb.png)

0
0 Comments

问题:查找两个数据框之间的差异。

原因:方法1不能处理含有NaN值的数据框,因为pd.np.nan != pd.np.nan。虽然不确定是否这是最佳方法,但可以通过df1[~df1.astype(str).apply(tuple, 1).isin(df2.astype(str).apply(tuple, 1))] 避免这个问题。这种方法较慢,因为需要将数据转换为字符串,但是由于转换,pd.np.nan == pd.np.nan

解决方法:首先,将值转换为字符串,并对每一行应用tuple函数。df1.astype(str).apply(tuple, 1)df2.astype(str).apply(tuple, 1)。通过这种方式,我们可以获得包含元组列表的pd.Series对象。每个元组包含来自df1/df2的整行数据。然后,我们在df1上应用isin方法,以检查每个元组是否“在”df2中。结果是一个包含布尔值的pd.Series。如果来自df1的元组在df2中,则为True。最后,我们使用~符号对结果取反,并在df1上应用过滤器。简而言之,我们只得到那些在df2中不存在的df1的行。

为了使代码更易读,我们可以将其写为:

df1_str_tuples = df1.astype(str).apply(tuple, 1)
df2_str_tuples = df2.astype(str).apply(tuple, 1)
df1_values_in_df2_filter = df1_str_tuples.isin(df2_str_tuples)
df1_values_not_in_df2 = df1[~df1_values_in_df2_filter]

这是一个很好的答案,但作为一行代码难以理解。如果将每个步骤分开并理解其功能,就会清楚它是如何完成任务的。

解释补充:希望对你有所帮助!

0
0 Comments

两个数据帧之间的差异可以通过比较行和列来找到。对于行的比较,可以使用merge函数,并设置indicator参数为True。对于列的比较,可以使用set函数和symmetric_difference方法。

出现这个问题的原因是需要比较两个数据帧之间的差异,以找出它们之间的共同部分和不同部分。解决方法是使用merge函数和set函数进行比较。

对于行的比较,可以使用merge函数,并设置indicator参数为True。具体代码如下:

m = df1.merge(df2, on='Name', how='outer', suffixes=['', '_'], indicator=True)

这样设置之后,merge函数会返回一个新的数据帧m,其中包含一个名为_merge的列,用于表示df1和df2之间的差异。_merge列的值可以是"left_only"、"right_only"或"both",分别表示在df1中出现、在df2中出现或同时在df1和df2中出现的行。

对于列的比较,可以使用set函数和symmetric_difference方法。具体代码如下:

set(df1.columns).symmetric_difference(df2.columns)

这样设置之后,set函数会返回两个数据帧之间的不同列的集合。

以上就是比较两个数据帧之间差异的方法。希望能对你有所帮助。

0
0 Comments

在这篇文章中,我们将讨论如何在两个数据框之间找到差异,并提供解决方法。在给出解决方法之前,我们先来看一下问题出现的原因。

在给出的代码中,使用了drop_duplicates函数来找出两个数据框之间的差异。然而,这种方法只适用于那些本身没有重复值的数据框。如果数据框中存在重复值,那么这种方法将无法正确找出差异。

举个例子,我们有两个数据框df1和df2,它们分别包含了相同的一列'A'和一列'B'。df1中的数据是[1,2,3,3]和[2,3,4,4],而df2中的数据是[1]和[2]。如果我们使用上述的方法来找出两个数据框之间的差异,将会得到错误的结果,如下所示:

pd.concat([df1, df2]).drop_duplicates(keep=False)
Out[655]: 
   A  B
1  2  3

这显然是错误的,因为正确的差异应该是[2,3,4]和[3,4]。那么我们应该如何解决这个问题呢?

文章中给出了两种解决方法:

方法1:使用isin函数和tuple来判断差异

df1[~df1.apply(tuple,1).isin(df2.apply(tuple,1))]
Out[657]: 
   A  B
1  2  3
2  3  4
3  3  4

方法2:使用merge函数和indicator来判断差异

df1.merge(df2,indicator = True, how='left').loc[lambda x : x['_merge']!='both']
Out[421]: 
   A  B     _merge
1  2  3  left_only
2  3  4  left_only
3  3  4  left_only

除了上述方法之外,还可以通过指定待比较的列来找出差异:pd.concat([df1,df2]).drop_duplicates(subset = ['col1','col2'], keep=False)。需要注意的是,这种方法在比较浮点数时可能会导致出现意外的结果,因为浮点数的精度问题可能导致相等的值被误判为不相等。

此外,文章中还提到了一些其他的问题和建议。例如,如果两个数据框的列名不同,那么合并操作会出现错误,因此需要确保两个数据框具有相同的列名。同时,对于方法2,可以替换lambda函数来提高效率:df = df1.merge(df2,indicator = True, how='left') df = df.loc[df['_merge']!='both']。还有一些建议是使用merge函数的indicator=True参数来覆盖所有情况,并解释了apply(tuple,1)的含义。

,本文介绍了如何在两个数据框之间找到差异的问题,并给出了解决方法。这些方法可以帮助我们快速准确地找出两个数据框之间的差异,提高数据处理的效率和准确性。

0