Skip to main content
 首页 » 编程设计

python之来自两个 pandas DataFrame 的不相交的记录集

2025年05月04日8Leo_wl

有没有一种简单的方法可以在基于 MultiIndex 的两个 pandas 数据帧之间找到不相交的记录集(两个原始数据帧中的每一个上未包含在生成的内部连接中的内容)?

我是不是遗漏了一些相当明显的东西,还是我必须花一些时间自己实现这种功能?

我试图通过找到两个数据帧的 muliIndex 键集之间的对称差异来做到这一点,但事实证明这很困难。我一直在努力让它发挥作用。我的另一个选择似乎更容易一些,是添加一个虚拟的整数列,它可以充当不同的单个索引,即使在我执行 multiIndex 合并之后也能保留,这样我就可以使用 python 集合运算符这个事实上的单一 key 。

[请注意,这与此问题相关但略有不同,因为此合并不是基于 MultiIndex 对象,而是基于数据框列中的值:How do I do a SQL style disjoint or set difference on two Pandas DataFrame objects? ]

请您参考如下方法:

我认为您找到对称差异的方法是可行的方法。

In [97]: from numpy import random 
 
In [98]: arrays1 = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], 
   ....:           ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']] 
 
 
In [99]: arrays2 = [['bar', 'baz', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], [ 
   ....: 'one', 'one', 'two', 'three', 'one', 'two', 'one', 'three']] 
 
 
In [100]: tuples1 = zip(*arrays1) 
 
In [101]: tuples2 = zip(*arrays2) 
 
In [102]: index1 = MultiIndex.from_tuples(tuples1, names=['first', 'second']) 
 
In [103]: index2 = MultiIndex.from_tuples(tuples2, names=['first', 'second']) 
 
In [104]: df1 = pd.DataFrame(random.randn(8, 2), index=index1) 
 
In [105]: df2 = pd.DataFrame(random.randn(8, 2), index=index2) 
 
In [106]: df1 
Out[106]:  
                     0         1 
first second                     
bar   one     0.613378 -0.400247 
baz   one    -3.005834  0.004879 
      two     0.066539 -0.289100 
      three  -0.020099  0.644226 
foo   one    -0.461458 -1.621812 
      two     0.286655  0.110588 
qux   one     0.363648 -0.271281 
      three   1.707787 -1.832602 
 
In [107]: df2 
Out[107]:  
                     0         1 
first second                     
bar   one    -1.010482 -0.023373 
baz   one    -0.040335  1.553905 
      two    -0.080283 -0.571686 
      three  -0.985722 -0.795481 
foo   one     0.623122  2.124316 
      two    -0.493333 -0.343462 
qux   one    -1.346753 -1.343945 
      three  -0.053497 -0.382402 
 
In [108]: sym_diff = (df1.index - df2.index).union(df2.index - df1.index) 
 
In [109]: sym_diff 
Out[109]:  
MultiIndex 
[(u'baz', u'three'), (u'qux', u'three')] 

我不确定为什么 MultiIndex 上没有对称差分法。