我按 id 对包含相同值的两个数据帧进行了排序,但发现它们不相等

I sorted two dataframes by id that contain the same values but am getting that they are not equal

提问人:Angie 提问时间:2/18/2023 更新时间:2/18/2023 访问量:38

问:

我有两个数据帧:

DF1型

 ID        Name
 15        Max
 7         Stacy
 3         Frank
 2         Joe       

DF2型

 ID        Name
 2         Abigail
 3         Josh
 15        Jake 
 7         Brian  

我通过做对它们进行排序

df1 = df1.sort_values(by=['ID'])
df2 = df2.sort_values(by=['ID'])

获取

DF1型

 ID        Name
 2         Joe  
 3         Frank
 7         Stacy
 15        Max 

DF2型

 ID        Name
 2         Abigail
 3         Josh
 7         Brian
 15        Jake        

但是,当我通过以下方式检查两个数据帧中的“ID”列是否相同时

print(df1['ID'].equals(df2['ID']))

它返回 False,为什么会这样?有没有另一种方法可以用来返回两列相等?

Python Pandas 数据帧 相等

评论

1赞 jprebys 2/18/2023
两列是否具有相同的 dtype?
1赞 Grisha 2/18/2023
你可以弄清楚哪些元素是不同的。print(df1['ID'] == df2['ID'])

答:

0赞 ifly6 2/18/2023 #1

它们仍在原始索引上进行比较:

import io

df1 = pd.read_csv(io.StringIO('''ID        Name
15        Max
7         Stacy
3         Frank
2         Joe''', sep='\s+'))
df2 = pd.read_csv(io.StringIO('''ID        Name
2         Abigail
3         Josh
15        Jake 
7         Brian'''), sep='\s+')

df1 = df1.sort_values(by=['ID'])
df2 = df2.sort_values(by=['ID'])

基本上发生的事情是,它正在检查以下数据帧中的 和 是否相等;他们不是。IDID_other

>>> df1.join(df2, rsuffix='_other')
   ID   Name  ID_other Name_other
3   2    Joe         7      Brian
2   3  Frank        15       Jake
1   7  Stacy         3       Josh
0  15    Max         2    Abigail

如果要在不考虑索引的情况下检查相等性,请考虑:

df1['ID'].values == df2['ID'].values

或者重置两边的索引,然后使用 .eq

0赞 Serge de Gosson de Varennes 2/18/2023 #2

帧很可能具有不同的索引。您应该执行以下操作:

df1 = df1.sort_values(by=['ID']).reset_index(drop=True)
df2 = df2.sort_values(by=['ID']).reset_index(drop=True)
print(df1['ID'].equals(df2['ID']))  # this returns True

另类:


import pandas as pd

df1 = pd.DataFrame({'ID': [15, 7, 3, 2], 'Name': ['Max', 'Stacy', 'Frank', 'Joe']})
df2 = pd.DataFrame({'ID': [2, 3, 15, 7], 'Name': ['Abigail', 'Josh', 'Jake', 'Brian']})

df1 = df1.sort_values(by=['ID']).reset_index(drop=True)
df2 = df2.sort_values(by=['ID']).reset_index(drop=True)

print(df1['ID'].equals(df2['ID']))  # should return True
0赞 I'mahdi 2/18/2023 #3

你不需要排序。你可以使用 pandas。DataFrame.set_index使用 pandas。DataFrame.eq

df1.set_index('ID').eq(df2.set_index('ID'))

例如,如果和喜欢:df1df2

>>> print(df1)
#    ID   Name
# 0  15    Max
# 1   7  Stacy
# 2   3  Frank
# 3   2    Joe

>>> print(df2)
#    ID     Name
# 0   2  Abigail
# 1   3     Josh
# 2  15      Max
# 3   7    Brian

>>> df1.set_index('ID').eq(df2.set_index('ID'))
     Name
ID       
2   False
3   False
7   False
15   True