3

MultiIndex に基づく 2 つの pandas データフレーム間で、ばらばらなレコード セット (結果の内部結合に含まれない 2 つの元のデータフレームのそれぞれに残るもの) を見つける簡単な方法はありますか?

私はかなり明白なものを見逃していますか、それともこの種の機能を自分で実装するのに時間を費やす必要がありますか?

2 つのデータフレームの一連の muliIndex キーの対称的な違いを見つけることでこれを実行しようとしましたが、これは困難であることが判明しました。私はこれを機能させるのに苦労しています。私の他のオプションは、少し簡単に思えるかもしれませんが、 multiIndex マージを実行した後でも保持される別の単一インデックスとして機能できる整数のダミー列を追加することです。これにより、python set 演算子を使用できるようになりますこの事実上の単一のキー。

[このマージは MultiIndex オブジェクトではなく、データフレームの列の値に基づいているため、これはこの質問に関連していますが、わずかに異なることに注意してください: 2 つの Pandas DataFrame オブジェクトで SQL スタイルの分離または設定の違いを行うにはどうすればよいですか? ? ]

4

2 に答える 2

1

対称的な違いを見つけるというあなたのアプローチが進むべき道だと思います。

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 に対称差分法がない理由がわかりません。

于 2013-07-15T00:52:55.807 に答える