땜질하고 pd.merge()
빠른 무엇에 대한 느낌을 얻으려고, 어떤 아니다. 나를 놀라게하는 일 중 하나는 병합 테이블이다 foo
그리고 bar
나는 값이 중복 포함되어 있는지 제공, 오히려 자신의 인덱스에 병합 한 후 그 열을 인덱스를 만들고보다 일반 OLE 열을 병합하는 경우 속도가 매우 빠르고입니다.
import numpy as np
import pandas as pd
import timeit
np.random.seed(2020)
foo = pd.DataFrame({'A': np.random.choice(10**6, size=10**6, replace=True), 'Foo': 'dummy column'})
bar = pd.DataFrame({'A': np.random.choice(10**6, size=10**6, replace=True), 'Bar': 'dummy column'})
# column <-> column
timeit.timeit(lambda: pd.merge(left=foo, right=bar, on='A', how='inner'), number=10) # 4.275
# index <-> column
foo.set_index('A', inplace=True)
timeit.timeit(lambda: pd.merge(left=foo, right=bar, left_index=True, right_on='A', how='inner'), number=10) # 4.329
# index <-> index
bar.set_index('A', inplace=True)
timeit.timeit(lambda: pd.merge(left=foo, right=bar, left_index=True, right_index=True, how='inner'), number=10) # 9.863
왜 이런 일이 발생합니까?
내부적으로 두 메서드 모두 _get_join_indexers
pandas.core.reshape.merge에서 호출 됩니다. 그러나 이것이 호출되는 방식에는 약간의 차이가 있습니다 ( https://github.com/pandas-dev/pandas/blob/master/pandas/core/reshape/merge.py#L844 ).
당신이 모두를 제공하는 경우 left_index=True
와 right_index=True
, 후드 아래에 무슨 본질적으로 left_index.join(right_index)
. _get_join_indexers
여기에서 호출됩니다
당신의 모두를 제공하지 않는 경우 left_index=True
와 right_index=True
, _get_join_indexers
더 직접적으로 호출
그래서 우리 left_index.join(right_index)
가 이것을 늦추는 것을 부를 때 무슨 일이 일어나고 있습니까? 대답은 sort
인덱스가 고유하지 않고 (이 예에 따라) 항상 True
( https://github.com/pandas-dev/pandas/blob/v0.25.3으로 설정된 경우 인수가 실제로 완전히 전파되지 않는다는 것입니다. /pandas/core/indexes/base.py#L3689 ).
사실, 결과를 보면 실제로는 같지 않습니다! 두 인덱스를 모두 사용하면 결과가 정렬됩니다 (병합에 전달하는 인수가이지만 sort=False
). sort=True
모든 병합 방법을 전달 하면 런타임이 예상대로 거의 동일 해집니다.
TL, DR : sort
kwarg가 올바르게 전파되지 않고 고유하지 않은 인덱스에 병합 할 때 준수되지 않습니다 (PR 수신!)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다