해결된 질문
작성
·
103
·
수정됨
0
5.1 업종 테마주 수집.ipynb 진행 과정에서
pd.concat(result.tolist()) 에서
InvalidIndexError: Reindexing only valid with uniquely valued Index objects
가 발생하는데, inplace=True를 추가 또는 다양한 방법으로 해결하려 해도 해결이 되지 않습니다.
이전 다른 분들도 같은 오류가 나서 문의를 하였는데 해결이 되었나요?
참고로, 테스트 하는 과정에서 get_item_info 함수 안의
finance_info = tables[3].iloc[:, [0, -1]]
finance_info.columns = [0, 1]
item_info.append(finance_info)
문장을 주석처리 하면 pd.concat(result.tolist()) 부분이 정상적으로 처리가 되고 있습니다.
원인과 해결 방법을 알려 주시면 감사하겠습니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
pd.concat(result.tolist())
에서 InvalidIndexError: Reindexing only valid with uniquely valued Index objects
오류가 발생하는 경우, 합치려는 DataFrame들 중 하나 이상이 중복된 인덱스 값을 가지고 있기 때문입니다. 이는 pd.concat
함수가 유니크한 인덱스를 기대하는데, 중복된 인덱스 값을 갖는 DataFrame이 존재할 때 발생합니다.
문제를 해결하기 위해 아래 방법을 시도해 볼 수 있습니다.
인덱스 초기화: 각 DataFrame의 인덱스를 reset_index()
를 통해 초기화한 후에 pd.concat
을 시도합니다. 이렇게 하면 각 DataFrame이 고유한 인덱스를 가지게 되어 오류가 해결될 수 있습니다.
result = [df.reset_index(drop=True) for df in result]
pd.concat(result.tolist())
이 때, drop=True
옵션을 주면 기존 인덱스가 새로운 컬럼으로 추가되지 않고 삭제됩니다.
중복 인덱스 확인: pd.concat
하기 전에 각 DataFrame의 인덱스가 유니크한지 확인합니다. 만약 중복된 인덱스가 있다면, 인덱스를 변경하거나 유니크하게 만든 후 concat을 진행해야 합니다.
본문에서 언급하신 것처럼 finance_info = tables[3].iloc[:, [0, -1]]
에서 생성된 finance_info
DataFrame이 문제일 수 있습니다. 이 경우, finance_info
의 인덱스에 중복이 없는지 확인하거나, 위 방법으로 인덱스를 초기화하고 다시 시도해 보세요.
질문에서 언급된 get_item_info 함수
의 일부 코드를 주석 처리했을 때 오류가 사라진다는 점을 통해, 이 부분에서 중복 인덱스가 발생할 수 있음을 짐작할 수 있습니다. 따라서 finance_info
를 생성하거나 추가할 때 중복 인덱스가 발생하지 않도록 처리하는 것이 중요합니다.
해결 방안을 시도해 보시고, 여전히 문제가 해결되지 않는다면, 추가적인 정보나 오류 메시지와 함께 다시 문의해 주세요.
위의 방법으로도 문제가 해결되지 않아 원인을 파악해 본 결과, 다음과 같이 해결할 수 있었습니다.
네이버의 업종주 목록에는 코스피, 코스닥뿐만 아니라 코넥스도 포함되어 있습니다. 코넥스기업의 경우, 코스피/코스닥 기업과 달리 "기업실적분석" 결과가 없기 때문에 취합된 데이터 형식의 구성이 달라 오류가 발생하였습니다.
이를 해결하기 위하여
df_krx = df_krx[df_krx['Market'].isin(['KOSPI', 'KOSDAQ'])]
구문을 사용하여 코스피와 코스닥 기업만을 대상으로 데이터를 취합해 보니 다행히 정상적으로 진행되었습니다.모든 데이터를 취합하여 검증하고 후처리하는 것이 이상적이겠지만, 일단은 위 방법으로 수업을 계속 진행할 수 있었습니다. 혹시 다른 해결 방법을 알고 계시면 공유해 주시면 감사하겠습니다.
감사합니다.