본문 바로가기
파이썬/파이썬 궁금증 회고

파이썬 concat - 특정 경로 내 CSV 파일들을 하나의 DF로 합치기(병합하기)

by davi_kr 2024. 7. 22.

목차

    반응형

    특정 경로 내 CSV 파일들을 하나의 DF로 합치기(병합하기)

    같은 형태를 가진 csv가 여러개로 나뉘어 있을 때, 하나로 작업하기 위해 필요한 코드입니다.

     

    import pandas as pd
    import os
    
    # CSV 파일이 저장된 디렉터리 경로
    directory = "/Users/david/Documents/project/final_data_set"
    
    # CSV 파일을 하나의 df로 병합
    def merge_csv_files(directory):
        # CSV 인 것들만 리스트로 만듦
        csv_files = [f for f in os.listdir(directory) if f.endswith('.csv')]
    
        dfs = []
        
        # csv_files라는 리스트를 돌면서 csv 파일을 df로 변환한 뒤, 다시 dfs라는 이름의 리스트에 저장
        for csv_file in csv_files:
            file_path = os.path.join(directory, csv_file)
            df = pd.read_csv(file_path)
            dfs.append(df)
        
        # 모든 df 병합
        merged_df = pd.concat(dfs, ignore_index=True)
        return merged_df
    
    # 병합된 df
    merged_df = merge_csv_files(directory)
    
    # 결과 출력
    print(merged_df.head())
    
    # 병합된 df를 csv로 다시 저장
    merged_df.to_csv("/Users/david/Documents/project/merged_file.csv", index=False)

     

    df에 계속 추가하는 append 방식을 생각했었는데, 이제 df.append는 작동이 안 되는 것 같습니다.

    AttributeError: 'DataFrame' object has no attribute 'append'라는 오류를 반환하네요. (아래 사진 참고)

    언제부터 안 됐던 걸까요..? 옛날엔 됐던 것 같은데

    리스트에는 append가 문제 없이 작동합니다! 

    Concat 이해하기

    concat은 pd.concat()과 같은 형태로 사용합니다. 

    ① () 안에는 시리즈나 데이터프레임만 넣을 수 있다고 합니다.

    (only Series and DataFrame objs are valid)

    결과물은 넣은 값에 시리즈나 데이터프레임으로 나옵니다.

    시리즈와 데이터프레임을 합칠 수도 있는데, 그때는 데이터프레임으로 반환됩니다.

     

    ② 기본적으로는 쭉 아래로(행 기준으로) 합쳐집니다. 

    데이터프레임 기준에서 열이 같다면, 예시 1처럼 빈값 없이 쭉 합쳐집니다.

    열이 다르면, 예시 2처럼 서로 안맞는 위치에는 NaN으로 채워지면서 쭉 아래로 합쳐집니다.

    이는 concat의 합치는 방향의 디폴트 값이 아래 방향이기 때문입니다.

    예시 1
    예시 2

     

    만약, 오른쪽으로 쭉 이어붙이고 싶다면(열 기준으로) axis=1로 설정해줍니다.

    예시 1과 같이 pd.concat(dfs)는 똑같은데 ()안에 axis=1을 추가해줬더니 옆으로 추가됐습니다.

    예시 3

     

    ③ 합친 데이터들을 전부 표시해줍니다. 

    예시 2에서 본 것처럼 모든 데이터를 표시하려고 하다보니 NaN도 표시가 됩니다.

    만약 합치는 데이터 간에 공통된 것만 보고 싶다면 join을 활용할 수 있습니다.

    예시 2에서 join = 'inner'만 추가했더니 NaN이 있었던 test 열이 사라졌습니다.

    예시 4

     

    ④ 인덱스는 수정하고 싶으면 수정해야 합니다.

    예시 1과 예시 2를 눈썰미 있게 보셨다면, 인덱스에도 차이가 있다는 것을 보셨을텐데요.

    예시 1은 인덱스가 0,1,0,1인 반면, 예시 2는 0,1,2,3입니다.

    이처럼 concat은 기본적으론 합쳤을 때 인덱스를 안 고쳐줍니다.

    그래서 필요한 경우에 ignore_index = True를 사용해서 고쳐주셔야 합니다.

    반응형

    댓글