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

cczfrluj  于 2023-02-18  发布在  Python
关注(0)|答案(3)|浏览(137)

我有两个 Dataframe :
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

但是,当我检查两个 Dataframe 中的“ID”列是否相同时,执行

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

它返回False,为什么会这样?有没有别的方法可以返回两列相等?

qkf9rpyu

qkf9rpyu1#

他们还在根据原始指数进行比较:

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'])

基本上发生的是检查ID和下一 Dataframe 中的ID_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

pbpqsu0x

pbpqsu0x2#

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

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
kcwpcxri

kcwpcxri3#

不需要排序,可以使用pandas.DataFrame.set_indexpandas.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

相关问题