인프런 커뮤니티 질문&답변

김승백님의 프로필 이미지

작성한 질문수

파이썬 증권 데이터 수집과 분석으로 신호와 소음 찾기

pd.concat(result.tolist()) 오류 문의

해결된 질문

24.06.09 01:36 작성

·

81

·

수정됨

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 인턴님의 프로필 이미지

2024. 06. 11. 01:42

안녕하세요, 인프런 AI 인턴입니다.

pd.concat(result.tolist())에서 InvalidIndexError: Reindexing only valid with uniquely valued Index objects 오류가 발생하는 경우, 합치려는 DataFrame들 중 하나 이상이 중복된 인덱스 값을 가지고 있기 때문입니다. 이는 pd.concat 함수가 유니크한 인덱스를 기대하는데, 중복된 인덱스 값을 갖는 DataFrame이 존재할 때 발생합니다.

문제를 해결하기 위해 아래 방법을 시도해 볼 수 있습니다.

  1. 인덱스 초기화: 각 DataFrame의 인덱스를 reset_index()를 통해 초기화한 후에 pd.concat을 시도합니다. 이렇게 하면 각 DataFrame이 고유한 인덱스를 가지게 되어 오류가 해결될 수 있습니다.

    result = [df.reset_index(drop=True) for df in result]
    pd.concat(result.tolist())
    

    이 때, drop=True 옵션을 주면 기존 인덱스가 새로운 컬럼으로 추가되지 않고 삭제됩니다.

  2. 중복 인덱스 확인: pd.concat 하기 전에 각 DataFrame의 인덱스가 유니크한지 확인합니다. 만약 중복된 인덱스가 있다면, 인덱스를 변경하거나 유니크하게 만든 후 concat을 진행해야 합니다.

본문에서 언급하신 것처럼 finance_info = tables[3].iloc[:, [0, -1]]에서 생성된 finance_info DataFrame이 문제일 수 있습니다. 이 경우, finance_info의 인덱스에 중복이 없는지 확인하거나, 위 방법으로 인덱스를 초기화하고 다시 시도해 보세요.

질문에서 언급된 get_item_info 함수의 일부 코드를 주석 처리했을 때 오류가 사라진다는 점을 통해, 이 부분에서 중복 인덱스가 발생할 수 있음을 짐작할 수 있습니다. 따라서 finance_info를 생성하거나 추가할 때 중복 인덱스가 발생하지 않도록 처리하는 것이 중요합니다.

해결 방안을 시도해 보시고, 여전히 문제가 해결되지 않는다면, 추가적인 정보나 오류 메시지와 함께 다시 문의해 주세요.

김승백님의 프로필 이미지
김승백
질문자

2024. 06. 12. 12:00

위의 방법으로도 문제가 해결되지 않아 원인을 파악해 본 결과, 다음과 같이 해결할 수 있었습니다.

네이버의 업종주 목록에는 코스피, 코스닥뿐만 아니라 코넥스도 포함되어 있습니다. 코넥스기업의 경우, 코스피/코스닥 기업과 달리 "기업실적분석" 결과가 없기 때문에 취합된 데이터 형식의 구성이 달라 오류가 발생하였습니다.

이를 해결하기 위하여 df_krx = df_krx[df_krx['Market'].isin(['KOSPI', 'KOSDAQ'])] 구문을 사용하여 코스피와 코스닥 기업만을 대상으로 데이터를 취합해 보니 다행히 정상적으로 진행되었습니다.

모든 데이터를 취합하여 검증하고 후처리하는 것이 이상적이겠지만, 일단은 위 방법으로 수업을 계속 진행할 수 있었습니다. 혹시 다른 해결 방법을 알고 계시면 공유해 주시면 감사하겠습니다.

감사합니다.