티스토리 뷰

목적

  1. 행정구역명 (시도명, 시군구명)이 포함된 특정 CSV, Excel 파일이 존재함
  2. 해당 파일에 특정 시도명, 시군구명이 포함된 셀이 있는지 찾고
  3. 새로운 데이터 프레임에 해당 파일명과 포함된 시도, 시군구 정보를 생성하기

행정구역 파일 불러오기

행정기관(행정동) 및 관할구역(법정동) 변경내역(2023. 3. 30.)

 

juso_df = pd.read_excel('D:\행정구역추출\jsocde20230330\jsocde20230330\KIKmix.20230330.xlsx')

시도 리스트, 시군구 리스트, 읍면동 리스트 만들기

sido_list = list(juso_df.시도명.unique())
sido_list.remove('동해출장소')
sido_list.remove('북부출장소')
# nan 값 삭제
sigungu_list = list(juso_df.시군구명.unique())
sigungu_list = [x for x in sigungu_list if pd.isnull(x) == False]
# nan 값 삭제
dong_list = list(juso_df.읍면동명.unique())
dong_list = [x for x in dong_list if pd.isnull(x) == False]

 

행정구역 매핑하는 함수

def map_juso(juso_list, df, juso_col):
    mapping_juso_list = []
    for juso in juso_list:
        try:
            str_cat = df[juso_col].str.cat(sep=' ') # 열의 모든 셀을 하나의 string으로 합치는 함수
            #print(str_cat)
            if juso in str_cat: # 모든 셀을 합친 string에 원하는 값이 있는 경우에 append
                mapping_juso_list.append(juso)
            mapping_juso_list = [x for x in mapping_juso_list if pd.isnull(x) == False] # 혹시 None값이 있으면 삭제
        except:
            mapping_juso_list = []
    return mapping_juso_list

- juso_list: 위에서 만들었던 sido_list, sigungu_list, dong_list를 변수로 넣음

- df: 탐색하고자하는 csv,excel을 읽어서 데이터프레임으로 넣음

- juso_col: 주소정보(행정구역명)이 들어간 컬럼명을 넣음. 만약, 특정한 컬럼을 넣지 않는다면 for문으로 모든 컬럼이 juso_col에 들어가도록 코드를 작성하면 됨

 

 

활용 코드

new_df = pd.DataFrame(columns=['파일명','시도','시군구'])
for idx, row in tqdm(juso_df.iterrows(), total=juso_df.shape[0]):
    file_path = 경로
    file_format = str(row['파일명'].split('.')[-1]).upper()
    juso_column = # 주소가 들어있는 컬럼의 리스트 넣기
    
    try:
        if file_format == 'CSV':
            try:
                tmp = pd.read_csv(file_path, encoding=encoding, low_memory=False)
            except:
                tmp = pd.read_csv(file_path, low_memory=False)
            new_sido_list = []
            new_sigungu_list = []
            for col in juso_column:
                tmp_sido_list = map_juso(sido_list, tmp, col)
                new_sido_list.append(tmp_sido_list)

                tmp_sigungu_list = map_juso(sigungu_list, tmp, col)
                new_sigungu_list.append(tmp_sigungu_list)

            new_sido_list = [lst for lst in new_sido_list if len(lst) > 0]
            # 이 코드는 new_sido_list 안에 있는 리스트들의 원소들을 하나의 리스트로 모은 다음(set()으로 중복을 제거한)에 list()로 다시 리스트 형태로 변환합니다.
            new_sido_list_combined = list(set([val for sublist in new_sido_list for val in sublist]))
            new_sido_list_combined = [x for x in new_sido_list_combined if pd.isnull(x) == False]

            new_sigungu_list = [lst for lst in new_sigungu_list if len(lst) > 0]
            # 이 코드는 new_sigungu_list 안에 있는 리스트들의 원소들을 하나의 리스트로 모은 다음(set()으로 중복을 제거한)에 list()로 다시 리스트 형태로 변환합니다.
            new_sigungu_list_combined = list(set([val for sublist in new_sigungu_list for val in sublist]))
            new_sigungu_list_combined = [x for x in new_sigungu_list_combined if pd.isnull(x) == False]
                
            new_df.loc[idx] = [row['파일명'], new_sido_list_combined, new_sigungu_list_combined]

 

원래는 str.contains 함수를 써서 작성했다가, @JeongYunLee의 아이디어에 도움을 받아서 str.cat()을 썼더니 훨씬!!!! 속도가 개선되었습니다. 좋은 아이디어 감사~

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함