2013-07-14 3 views
2

두 팬더 데이터 프레임간에 기반이되는 분리 된 레코드 집합 (결과로 생성되는 내부 조인에 포함되지 않은 두 개의 원본 데이터 프레임 각각에 남게 될 내용)을 쉽게 찾을 수 있습니까? MultiIndex에?두 팬더 데이터 프레임의 서로 다른 레코드 집합

뭔가 확실하지 않거나 이런 종류의 기능을 직접 구현하는 데 시간을 할애해야합니까?

두 데이터 프레임의 muliIndex 키 집합 사이에 대칭 차이를 발견하여이를 시도했지만 이것이 어렵다는 것이 입증되었습니다. 나는 이것이 작동하도록 고심하고있다. 조금 더 쉬운 것처럼 보이는 다른 옵션은 multiIndex 병합을 수행 한 후에도 보존되는 다른 단일 인덱스로 작동 할 수있는 정수형 더미 열을 추가하는 것입니다. 따라서 파이썬 세트 연산자를 사용할 수 있습니다. 이것은 사실상 단일 키입니다.

[이 병합이 MultiIndex의 개체를 기반으로하지 않기 때문에이이 질문보다 약간 다르지만 관련이 있습니다,하지만 dataframe의 열의 값에 : How do I do a SQL style disjoint or set difference on two Pandas DataFrame objects?]

답변

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에 대칭 차이 방법이 없는지 잘 모르겠습니다.

+0

좋아, 내가 103 행을 index2로 바꾸고 108 행의 마지막 용어를 df1.index로 바꿀 때 작동합니다. 유일한 문제는 MultiIndex와 내 데이터 프레임의 크기로 sym_diff를 계산하는 데 거의 1 분이 걸리는 것입니다. 나는 당신의 방법이 더 우아 해 보였다고 생각하지만, 결국 나는 결국 약간 달랐다. 병합하기 전에 색인을 다시 보내고 두 번 병합하여 첫 번째 프레임과 두 번째 프레임의 색인을 유지합니다. 그럼 원래의 각 열에 색인에 의해 일치하는 행을 떨어 뜨렸다. 이것은 더 많은 코드 였지만 5 초 정도 걸렸습니다. –

+0

누구에게나 도움이 될 경우를 대비하여 나중에 내 솔루션을 나중에 작성하겠습니다. –

+0

오타와 유감스럽게 생각합니다. 두 계정 모두에 맞습니다. 내 길은 너무 느리다. 귀하의 색인은 미리 정렬되어 있습니까? 그게 가장 많은 시간을 들이고 있는지 아니면 그것이 설정된 작업인지 궁금합니다. – TomAugspurger

0

동일한 테스트 데이터를 사용하여 다음

에 의해 분리 된 dataframe을 얻을 수있는 다음 두 표

     0   1 
first second      
bar one -0.579214 0.261575 
     two  0.912683 -0.475463 
baz one -0.295739 -0.586646 
     two  0.031916 0.199812 
foo one -0.724781 -1.245275 
     two -0.824759 2.270161 
qux one  0.638533 0.537306 
     two -0.988444 -1.076636 

     0   1 
first second      
bar one -0.859494 0.214814 
baz one -0.446976 1.281912 
     two -0.181159 0.574126 
     three 0.212799 -1.592317 
foo one -1.192866 1.544799 
     two  1.025816 0.921364 
qux one -0.927700 -0.516720 
     three 0.610065 0.028249 

를 산출 TomAugspurger

import pandas as pd 
import numpy as np 

# create a test data set 
arrays1 = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], 
      ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']] 
arrays2 = [['bar', 'baz', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], 
      ['one', 'one', 'two', 'three', 'one', 'two', 'one', 'three']] 
tuples1 = zip(*arrays1) 
tuples2 = zip(*arrays2) 
index1 = pd.MultiIndex.from_tuples(tuples1, names=['first', 'second']) 
index2 = pd.MultiIndex.from_tuples(tuples2, names=['first', 'second']) 
df1 = pd.DataFrame(np.random.randn(8, 2), index=index1) 
df2 = pd.DataFrame(np.random.randn(8, 2), index=index2) 

에 의해 설명 된대로

df1[~df1.index.isin(df2.index)].append(df2[~df2.index.isin(df1.index)]) 

     0   1 
first second      
bar two  0.912683 -0.475463 
qux two -0.988444 -1.076636 
baz three 0.212799 -1.592317 
qux three 0.610065 0.028249 

의 결과는 당신이 요구 한 무엇인가요?

관련 문제