看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
df.compare() 和s.compare() 方法使您可以分别比较两个DataFrame 或 Series,并总结它们之间的差异。V1.1.0 中添加了此功能。
语法如下:
pd.compare(other, align_axis=1, keep_shape=False, keep_equal=False)
其中:
例如,您可能想要比较两个DataFrame并并排堆叠它们的差异。
df = pd.DataFrame(
    {
        "col1": ["a", "a", "b", "b", "a"],
        "col2": [1.0, 2.0, 3.0, np.nan, 5.0],
        "col3": [1.0, 2.0, 3.0, 4.0, 5.0]
    },
    columns=["col1", "col2", "col3"],
)
df
'''
  col1  col2  col3
0    a   1.0   1.0
1    a   2.0   2.0
2    b   3.0   3.0
3    b   NaN   4.0
4    a   5.0   5.0
'''
# 对数据进行修改以便进行对比
df2 = df.copy()
df2.loc[0, 'col1'] = 'c'
df2.loc[2, 'col3'] = 4.0
df2
'''
  col1  col2  col3
0    c   1.0   1.0
1    a   2.0   2.0
2    b   3.0   4.0
3    b   NaN   4.0
4    a   5.0   5.0
'''
应用对比:
df.compare(df2)
'''
  col1       col3
  self other self other
0    a     c  NaN   NaN
2  NaN   NaN  3.0   4.0
'''
默认情况下,如果两个对应的值相等,它们将显示为NaN。 此外,如果整个行/列中的所有值都将从结果中省略。 其余差异将在列上对齐。
还可以传入以下参数:
df = pd.DataFrame(
    {
        "col1": ["a", "a", "b", "b", "a"],
        "col2": [1.0, 2.0, 3.0, np.nan, 5.0],
        "col3": [1.0, 2.0, 3.0, 4.0, 5.0]
    },
    columns=["col1", "col2", "col3"],
)
df
'''
  col1  col2  col3
0    a   1.0   1.0
1    a   2.0   2.0
2    b   3.0   3.0
3    b   NaN   4.0
4    a   5.0   5.0
'''
修改数据,方便对比:
df2 = df.copy()
df2.loc[0, 'col1'] = 'c'
df2.loc[2, 'col3'] = 4.0
df2
'''
  col1  col2  col3
0    c   1.0   1.0
1    a   2.0   2.0
2    b   3.0   4.0
3    b   NaN   4.0
4    a   5.0   5.0
'''
显示有差异的列:
df.compare(df2)
'''
  col1       col3
  self other self other
0    a     c  NaN   NaN
2  NaN   NaN  3.0   4.0
'''
将差异堆叠在行上:
df.compare(df2, align_axis=0)
'''
        col1  col3
0 self     a   NaN
  other    c   NaN
2 self   NaN   3.0
  other  NaN   4.0
'''
保留相等的值:
df.compare(df2, keep_equal=True)
'''
  col1       col3
  self other self other
0    a     c  1.0   1.0
2    b     b  3.0   4.0
'''
保留所有原始行和列:
df.compare(df2, keep_shape=True)
'''
  col1       col2       col3
  self other self other self other
0    a     c  NaN   NaN  NaN   NaN
1  NaN   NaN  NaN   NaN  NaN   NaN
2  NaN   NaN  NaN   NaN  3.0   4.0
3  NaN   NaN  NaN   NaN  NaN   NaN
4  NaN   NaN  NaN   NaN  NaN   NaN
'''
保留所有原始行和列以及所有原始值:
df.compare(df2, keep_shape=True, keep_equal=True)
'''
  col1       col2       col3
  self other self other self other
0    a     c  1.0   1.0  1.0   1.0
1    a     a  2.0   2.0  2.0   2.0
2    b     b  3.0   3.0  3.0   4.0
3    b     b  NaN   NaN  4.0   4.0
4    a     a  5.0   5.0  5.0   5.0
'''
此外,还可以使用df1.equals(df2)来对比两个数据是否一致,测试两个对象是否包含相同的元素。
此功能允许将两个Series或DataFrame相互比较,以查看它们是否具有相同的形状和元素。 相同位置的NaN被认为是相等的。 列标题不必具有相同的类型,但是列中的元素必须具有相同的dtype。
此功能要求元素与其他Series或DataFrame中的元素具有相同的dtype。 但是,列标签不必具有相同的类型,只要它们仍被视为相等即可。
df = pd.DataFrame({1: [10], 2: [20]})
df
    1   2
0  10  20
DataFrames df和fully_equal的元素和列标签具有相同的类型和值,它们将返回True。
exactly_equal = pd.DataFrame({1: [10], 2: [20]})
exactly_equal
'''
    1   2
0  10  20
'''
df.equals(exactly_equal)
# True
DataFrames df和different_column_type具有相同的元素类型和值,但列标签具有不同的类型,它们仍将返回True。
different_column_type = pd.DataFrame({1.0: [10], 2.0: [20]})
different_column_type
'''
   1.0  2.0
0   10   20
'''
df.equals(different_column_type)
# True
DataFrames df和different_data_type为其元素的相同值具有不同的类型,即使它们的列标签具有相同的值和类型,它们也将返回False。
different_data_type = pd.DataFrame({1: [10.0], 2: [20.0]})
different_data_type
'''
      1     2
0  10.0  20.0
'''
df.equals(different_data_type)
# False
DataFrame.align 不会组合两个数据帧,但是可以将它们对齐,以便两个数据帧具有相同的行和/或列配置。我们看一个例子:
df1 = pd.DataFrame([[1,2,3,4], [6,7,8,9]], 
                   columns=['D', 'B', 'E', 'A'],
                   index=[1,2])
df2 = pd.DataFrame([[10,20,30,40], [60,70,80,90], [600,700,800,900]],
                   columns=['A', 'B', 'C', 'D'],
                   index=[2,3,4])
df1
'''
   D  B  E  A
1  1  2  3  4
2  6  7  8  9
'''
df2
'''
     A    B    C    D
2   10   20   30   40
3   60   70   80   90
4  600  700  800  900
'''
让我们对齐这两个数据帧,按列对齐(axis=1),并对列标签执行外部联接(join='outer'):
a1, a2 = df1.align(df2, join='outer', axis=1)
print(a1)
print(a2)
'''
   A  B   C  D  E
1  4  2 NaN  1  3
2  9  7 NaN  6  8
A    B    C    D   E
2   10   20   30   40 NaN
3   60   70   80   90 NaN
4  600  700  800  900 NaN
'''
这里有几点需要注意:
如果我们在行和列上对齐,但将join参数更改为“right”,会发生什么情况?
a1, a2 = df1.align(df2, join='right', axis=None)
print(a1)
print(a2)
'''
     A    B   C    D
2  9.0  7.0 NaN  6.0
3  NaN  NaN NaN  NaN
4  NaN  NaN NaN  NaN
     A    B    C    D
2   10   20   30   40
3   60   70   80   90
4  600  700  800  900
'''
总之,如果要确保两个数据帧之间的行和/或列的排列相同,而不改变两个数据帧中包含的任何数据,请使用 DataFrame.align()。Series 也支持此方法。
更多内容查看:align() 数据对齐方法介绍。
更新时间:2022-05-08 09:23:14 标签:pandas 对比