看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注: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 对比