如何不考虑顺序验证DataFrame子集的索引与另一DataFrame指定列的元素完全匹配
如何不考虑顺序验证DataFrame索引与另一列元素完全匹配?
这个问题我之前也碰到过!确实equals()方法对顺序要求太严格,必须元素顺序完全一致才会返回True。不过有几种简单的方法可以帮你验证两者的元素是否完全匹配(不考虑顺序),根据你的数据情况可以选择不同的方案:
方法1:利用集合的无序性(适合无重复元素的场景)
如果你的df2['column_name']和筛选后的df.index都没有重复元素,可以直接把两者转成集合后比较:
set(df.index) == set(df2['column_name'])
这种方法简单直观,集合本身就不关心元素顺序,只要元素完全一致就会返回True。
方法2:排序后用equals()验证(支持重复元素)
如果数据里存在重复元素,集合会自动去重,这时候就需要用排序后比较的方法:
# 对索引和列分别排序后再比较 df.index.sort_values().equals(df2['column_name'].sort_values())
或者用numpy的array_equal方法,效果是一样的:
import numpy as np np.array_equal(df.index.sort_values(), df2['column_name'].sort_values())
结合你的示例测试
我们稍微调整一下你的示例,让df2['column_name']的顺序和筛选后的索引不同,更贴近你的实际场景:
import pandas as pd import numpy as np df1 = pd.DataFrame(np.array([1,2,3,4,5,6]),index=['a', 'b', 'c', 'd', 'e', 'f'], columns=['values']) # 调整df2的column_name顺序为c、b、a,模拟顺序不一致的情况 df2 = pd.DataFrame(np.array(['c', 'b', 'a']), index=range(3), columns=['column_name']) df = df1[df1.index.isin(df2['column_name'])] # 用原生equals()会返回False,因为顺序不同 print(df.index.equals(df2['column_name'])) # 输出: False # 用排序后的equals()验证,返回True print(df.index.sort_values().equals(df2['column_name'].sort_values())) # 输出: True # 用集合验证(这里无重复元素,可行) print(set(df.index) == set(df2['column_name'])) # 输出: True
这样就能准确验证筛选后的索引和目标列的元素是否完全匹配,不用在意顺序啦!
内容的提问来源于stack exchange,提问作者user9317212
相关产品推荐
相关产品推荐

