동일한 테스트 데이터를 사용하여 다음
에 의해 분리 된 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
의 결과는 당신이 요구 한 무엇인가요?
좋아, 내가 103 행을 index2로 바꾸고 108 행의 마지막 용어를 df1.index로 바꿀 때 작동합니다. 유일한 문제는 MultiIndex와 내 데이터 프레임의 크기로 sym_diff를 계산하는 데 거의 1 분이 걸리는 것입니다. 나는 당신의 방법이 더 우아 해 보였다고 생각하지만, 결국 나는 결국 약간 달랐다. 병합하기 전에 색인을 다시 보내고 두 번 병합하여 첫 번째 프레임과 두 번째 프레임의 색인을 유지합니다. 그럼 원래의 각 열에 색인에 의해 일치하는 행을 떨어 뜨렸다. 이것은 더 많은 코드 였지만 5 초 정도 걸렸습니다. –
누구에게나 도움이 될 경우를 대비하여 나중에 내 솔루션을 나중에 작성하겠습니다. –
오타와 유감스럽게 생각합니다. 두 계정 모두에 맞습니다. 내 길은 너무 느리다. 귀하의 색인은 미리 정렬되어 있습니까? 그게 가장 많은 시간을 들이고 있는지 아니면 그것이 설정된 작업인지 궁금합니다. – TomAugspurger