티스토리 뷰
목적
- 행정구역명 (시도명, 시군구명)이 포함된 특정 CSV, Excel 파일이 존재함
- 해당 파일에 특정 시도명, 시군구명이 포함된 셀이 있는지 찾고
- 새로운 데이터 프레임에 해당 파일명과 포함된 시도, 시군구 정보를 생성하기
행정구역 파일 불러오기
행정기관(행정동) 및 관할구역(법정동) 변경내역(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()을 썼더니 훨씬!!!! 속도가 개선되었습니다. 좋은 아이디어 감사~
반응형
'파이썬(Python)&판다스(Pandas)&Polars' 카테고리의 다른 글
[Pandas] groupby, agg 여러 행을 단일 행의 리스트로 넣기 (0) | 2023.04.28 |
---|---|
[Pandas] explode 단일 행을 여러 행으로 나누기 (0) | 2023.04.28 |
[Pandas] 여러 파일의 행 수, 열 수를 하나의 데이터 프레임으로 만들기(listdir(), shape()) (0) | 2023.02.02 |
[Pandas] 서로 다른 데이터프레임에서 특정 값을 매핑해 새로운 컬럼 만들기 (0) | 2023.01.10 |
[Pandas] combine_first - 두 컬럼 중 먼저 나온 값을 기준으로 새로운 컬럼 생성하기 (2) | 2022.10.24 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- TextRank
- python
- 지식그래프
- PostgreSQL
- LLM
- Encoding
- difflib
- Claude
- PEFT
- writerow
- knowlegegraph
- psycopg
- vscode
- hadoop
- 지식그래프임베딩
- p-tuing
- 키워드추출
- vervel
- cursorai
- python'
- polars
- Vue3
- ChatGPT
- rdflib
- Postgis
- pdfmathtranslate
- SPARQL
- MongoDB
- knowledgegraph
- pandas
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함