{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## 엑셀 데이터 병합하기" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 그런데 여기서 한 가지 큰 문제가 발생합니다.\n", "\n", "\n", "- 모든 OS가 같은 문제가 발생하는데, 일단 chrome에서 자동 다운로드를 진행하면 크롬 기본 지정경로인 \"다운로드\" 폴더에 엑셀파일이 저장됩니다.\n", "\n", "\n", "- 모두 다 같은 이름으로 저장이 되다보니, 번호만 쭉 붙어서 저장이 되는데 이러면 어느 지역파일인지 이름으로 알 수가 없습니다.\n", "\n", "\n", "- 그래서 pandas를 이용하여 특정 \"시/도\"의 크롤링이 끝날때마다 다운로드 폴더에 있는 다운로드된 엑셀파일(.xls)를 불러와서, 이름을 변경합니다.\n", "\n", "\n", "- 이름이 변경되면 일단 다른 \"시/도\"에서 다시 크롤링이 시작되었을 때 기존의 엑셀파일들과 이름이 중복되지 않기 때문에 \"시/도\"별 구분이 가능합니다.\n", "\n", "\n", "- 그 때마다 변경된 이름을 가진 엑셀파일들을 모아서 하나로 저장하면, \"시/도\" 별로 그때그때 취합한 데이터를 저장할 수 있습니다.\n", "\n", "\n", "- 엑셀을 불러오는 파트는 Pandas로 구현하였고, pandas를 통해서 데이터를 합쳐봅니다." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 서울시 데이터를 기준으로 테스트 해보기" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- OS마다 다른 이름으로 엑셀 파일들이 지역구의 개수만큼 저장되어 있습니다. (다운로드 폴더에)\n", "\n", "\n", "- 다운로드 폴더에서 모든 .xls 파일을 가져옵니다. (주의 : 혹시 다운로드 폴더에 이전에 받았던 다른 xls 파일이 없는지 먼저 확인해봅니다.)\n", "\n", "\n", "- 다운로드 받는(받을) 모든 엑셀파일은 이름이 같습니다. 그렇기 때문에 시/도 마다 정리하기 위해서는 시/도 마다 엑셀파일들을 정리해서 규합해야합니다.\n", "\n", "\n", "- 파일이름은 혼동을 피하기 위해서 해당 시/도 이름을 파일에 넣습니다. (여기서는 \"변환대상(시/도).xls\"로 하겠습니다.)\n", "\n", "\n", "- glob 라이브러리를 통해서 파일이름들을 불러오고, os.rename 함수를 통해 파일이름을 변경합니다.\n", "\n", "\n", "- pandas의 read_excel 함수를 통해 모든 엑셀파일들을 불러와서 하나로 합칩니다." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Defaulting to user installation because normal site-packages is not writeable\n", "Requirement already satisfied: openpyxl in c:\\programdata\\anaconda3\\lib\\site-packages (3.0.9)\n", "Requirement already satisfied: et-xmlfile in c:\\programdata\\anaconda3\\lib\\site-packages (from openpyxl) (1.1.0)\n" ] } ], "source": [ "!pip install openpyxl" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
지역_위치별(주유소)Unnamed: 1Unnamed: 2Unnamed: 3Unnamed: 4Unnamed: 5Unnamed: 6Unnamed: 7Unnamed: 8Unnamed: 9
0NaNNaNNaNNaNNaNNaNNaNNaNNaN(단위 : 원/리터)
1지역상호주소상표전화번호셀프여부고급휘발유휘발유경유실내등유
2경기도대보유통(주) 안성(서울)주유소/충전소경기 안성시 경부고속도로 372-1알뜰(ex)031-664-4096Y-14991614-
3경기도한국도로공사 안성(부산방향)주유소/충전소경기 안성시 원곡면 경부고속도로 365알뜰(ex)031-651-5385Y-15001575-
4경기도(주)서원 안성맞춤(평택)주유소/충전소경기 안성시 서운면 평택제천고속도로 41알뜰(ex)031-672-9622Y-15111577-
.................................
96경기도형제주유소경기 안성시 공도읍 덕봉서원로 100SK에너지031-652-5145N-164916791450
97경기도유일산업(주) 일죽주유소경기 안성시 일죽면 서동대로 7321-18GS칼텍스031-673-4700N-16581698-
98경기도미양농협주유소경기 안성시 미양면 미양로 62NH-OIL031-674-8774N-167917991500
99경기도대림주유소경기 안성시 공도읍 서동대로 4519SK에너지031-618-2155N-167916991500
100경기도봉산주유소경기 안성시 중앙로461번길 (봉산동)SK에너지031-674-5145Y-169517851600
\n", "

101 rows × 10 columns

\n", "
" ], "text/plain": [ " 지역_위치별(주유소) Unnamed: 1 Unnamed: 2 Unnamed: 3 \\\n", "0 NaN NaN NaN NaN \n", "1 지역 상호 주소 상표 \n", "2 경기도 대보유통(주) 안성(서울)주유소/충전소 경기 안성시 경부고속도로 372-1 알뜰(ex) \n", "3 경기도 한국도로공사 안성(부산방향)주유소/충전소 경기 안성시 원곡면 경부고속도로 365 알뜰(ex) \n", "4 경기도 (주)서원 안성맞춤(평택)주유소/충전소 경기 안성시 서운면 평택제천고속도로 41 알뜰(ex) \n", ".. ... ... ... ... \n", "96 경기도 형제주유소 경기 안성시 공도읍 덕봉서원로 100 SK에너지 \n", "97 경기도 유일산업(주) 일죽주유소 경기 안성시 일죽면 서동대로 7321-18 GS칼텍스 \n", "98 경기도 미양농협주유소 경기 안성시 미양면 미양로 62 NH-OIL \n", "99 경기도 대림주유소 경기 안성시 공도읍 서동대로 4519 SK에너지 \n", "100 경기도 봉산주유소 경기 안성시 중앙로461번길 (봉산동) SK에너지 \n", "\n", " Unnamed: 4 Unnamed: 5 Unnamed: 6 Unnamed: 7 Unnamed: 8 Unnamed: 9 \n", "0 NaN NaN NaN NaN NaN (단위 : 원/리터) \n", "1 전화번호 셀프여부 고급휘발유 휘발유 경유 실내등유 \n", "2 031-664-4096 Y - 1499 1614 - \n", "3 031-651-5385 Y - 1500 1575 - \n", "4 031-672-9622 Y - 1511 1577 - \n", ".. ... ... ... ... ... ... \n", "96 031-652-5145 N - 1649 1679 1450 \n", "97 031-673-4700 N - 1658 1698 - \n", "98 031-674-8774 N - 1679 1799 1500 \n", "99 031-618-2155 N - 1679 1699 1500 \n", "100 031-674-5145 Y - 1695 1785 1600 \n", "\n", "[101 rows x 10 columns]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "temp = pd.read_excel(\"지역_위치별(주유소).xls\")\n", "# temp = pd.read_excel(stations_files[0], header = 2) # 동일한 컬럼 이름을 가지도록" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
지역상호주소상표전화번호셀프여부고급휘발유휘발유경유실내등유
0서울특별시재건에너지 재정제2주유소 고속셀프지점서울특별시 강동구 천호대로 1246 (둔촌제2동)현대오일뱅크02-487-2030Y-15691669-
1서울특별시(주)소모에너지 신월주유소서울 강동구 양재대로 1323 (성내동)GS칼텍스02-6956-6674Y1836158616981650
2서울특별시구천면주유소서울 강동구 구천면로 357 (암사동)현대오일뱅크02-441-0536N-15941723-
3서울특별시대성석유(주)길동주유소서울 강동구 천호대로 1168GS칼텍스02-474-7222N1845159617281600
4서울특별시(주)삼표에너지 고덕주유소서울 강동구 고덕로 39 (암사동)GS칼텍스02-441-3327Y1845162517451615
.................................
94경기도형제주유소경기 안성시 공도읍 덕봉서원로 100SK에너지031-652-5145N-164916791450
95경기도유일산업(주) 일죽주유소경기 안성시 일죽면 서동대로 7321-18GS칼텍스031-673-4700N-16581698-
96경기도미양농협주유소경기 안성시 미양면 미양로 62NH-OIL031-674-8774N-167917991500
97경기도대림주유소경기 안성시 공도읍 서동대로 4519SK에너지031-618-2155N-167916991500
98경기도봉산주유소경기 안성시 중앙로461번길 (봉산동)SK에너지031-674-5145Y-169517851600
\n", "

113 rows × 10 columns

\n", "
" ], "text/plain": [ " 지역 상호 주소 상표 \\\n", "0 서울특별시 재건에너지 재정제2주유소 고속셀프지점 서울특별시 강동구 천호대로 1246 (둔촌제2동) 현대오일뱅크 \n", "1 서울특별시 (주)소모에너지 신월주유소 서울 강동구 양재대로 1323 (성내동) GS칼텍스 \n", "2 서울특별시 구천면주유소 서울 강동구 구천면로 357 (암사동) 현대오일뱅크 \n", "3 서울특별시 대성석유(주)길동주유소 서울 강동구 천호대로 1168 GS칼텍스 \n", "4 서울특별시 (주)삼표에너지 고덕주유소 서울 강동구 고덕로 39 (암사동) GS칼텍스 \n", ".. ... ... ... ... \n", "94 경기도 형제주유소 경기 안성시 공도읍 덕봉서원로 100 SK에너지 \n", "95 경기도 유일산업(주) 일죽주유소 경기 안성시 일죽면 서동대로 7321-18 GS칼텍스 \n", "96 경기도 미양농협주유소 경기 안성시 미양면 미양로 62 NH-OIL \n", "97 경기도 대림주유소 경기 안성시 공도읍 서동대로 4519 SK에너지 \n", "98 경기도 봉산주유소 경기 안성시 중앙로461번길 (봉산동) SK에너지 \n", "\n", " 전화번호 셀프여부 고급휘발유 휘발유 경유 실내등유 \n", "0 02-487-2030 Y - 1569 1669 - \n", "1 02-6956-6674 Y 1836 1586 1698 1650 \n", "2 02-441-0536 N - 1594 1723 - \n", "3 02-474-7222 N 1845 1596 1728 1600 \n", "4 02-441-3327 Y 1845 1625 1745 1615 \n", ".. ... ... ... ... ... ... \n", "94 031-652-5145 N - 1649 1679 1450 \n", "95 031-673-4700 N - 1658 1698 - \n", "96 031-674-8774 N - 1679 1799 1500 \n", "97 031-618-2155 N - 1679 1699 1500 \n", "98 031-674-5145 Y - 1695 1785 1600 \n", "\n", "[113 rows x 10 columns]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from glob import glob\n", "from tqdm.notebook import tqdm\n", "import os\n", "\n", "# glob 함수를 이용해서 엑셀파일 목록을 가져옵니다.\n", "stations_files = glob('./data/*.xls')\n", "stations_files # 모든 경로를 가져옴\n", "temp = pd.read_excel(stations_files[0], header = 2) # 동일한 컬럼 이름을 가지도록\n", "temp2 = pd.read_excel(stations_files[1], header = 2)\n", "pd.concat([temp, temp2])" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
지역상호주소상표전화번호셀프여부고급휘발유휘발유경유실내등유
0경기도(주)제스 조은주유소경기 안성시 대덕면 서동대로 4776GS칼텍스031-674-5149N-156016651700
1경기도옥산주유소경기 안성시 중앙로 162 (옥산동)SK에너지031-672-6751N-157916591500
2경기도안일주유소경기 안성시 안성맞춤대로 1250 (당왕동)SK에너지031-674-2700N-157816781400
3경기도명도주유소경기 안성시 양성면 양성로 373현대오일뱅크031-674-5190N-157816481400
4경기도SK진현주유소경기 안성시 대덕면 안성맞춤대로 1600SK에너지031-675-0049N-157816781350
.................................
108서울특별시주)지유에너지직영 오렌지주유소서울 강동구 성안로 102 (성내동)SK에너지02-484-6165N-169518351693
109서울특별시천호현대주유소서울 강동구 천중로 67 (천호동)현대오일뱅크02-484-9323N-18231924-
110서울특별시광성주유소서울 강동구 올림픽로 673 (천호동)S-OIL02-470-5133N-197820281900
111서울특별시방아다리주유소서울 강동구 동남로 811 (명일동)SK에너지02-442-5145Y-164517851700
112서울특별시재건에너지 재정제2주유소 고속셀프지점서울특별시 강동구 천호대로 1246 (둔촌제2동)현대오일뱅크02-487-2030Y-15691669-
\n", "

113 rows × 10 columns

\n", "
" ], "text/plain": [ " 지역 상호 주소 상표 \\\n", "0 경기도 (주)제스 조은주유소 경기 안성시 대덕면 서동대로 4776 GS칼텍스 \n", "1 경기도 옥산주유소 경기 안성시 중앙로 162 (옥산동) SK에너지 \n", "2 경기도 안일주유소 경기 안성시 안성맞춤대로 1250 (당왕동) SK에너지 \n", "3 경기도 명도주유소 경기 안성시 양성면 양성로 373 현대오일뱅크 \n", "4 경기도 SK진현주유소 경기 안성시 대덕면 안성맞춤대로 1600 SK에너지 \n", ".. ... ... ... ... \n", "108 서울특별시 주)지유에너지직영 오렌지주유소 서울 강동구 성안로 102 (성내동) SK에너지 \n", "109 서울특별시 천호현대주유소 서울 강동구 천중로 67 (천호동) 현대오일뱅크 \n", "110 서울특별시 광성주유소 서울 강동구 올림픽로 673 (천호동) S-OIL \n", "111 서울특별시 방아다리주유소 서울 강동구 동남로 811 (명일동) SK에너지 \n", "112 서울특별시 재건에너지 재정제2주유소 고속셀프지점 서울특별시 강동구 천호대로 1246 (둔촌제2동) 현대오일뱅크 \n", "\n", " 전화번호 셀프여부 고급휘발유 휘발유 경유 실내등유 \n", "0 031-674-5149 N - 1560 1665 1700 \n", "1 031-672-6751 N - 1579 1659 1500 \n", "2 031-674-2700 N - 1578 1678 1400 \n", "3 031-674-5190 N - 1578 1648 1400 \n", "4 031-675-0049 N - 1578 1678 1350 \n", ".. ... ... ... ... ... ... \n", "108 02-484-6165 N - 1695 1835 1693 \n", "109 02-484-9323 N - 1823 1924 - \n", "110 02-470-5133 N - 1978 2028 1900 \n", "111 02-442-5145 Y - 1645 1785 1700 \n", "112 02-487-2030 Y - 1569 1669 - \n", "\n", "[113 rows x 10 columns]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "total = pd.DataFrame()\n", "for file_name in stations_files:\n", " temp = pd.read_excel(file_name, header = 2)\n", " total = pd.concat([total, temp])\n", "\n", "total = total.sort_values(by=\"지역\")\n", "total = total.reset_index(drop = True) # 기존 인덱스 날리기\n", "total" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "total.to_excel(\"전체주유소.xlsx\", index=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 이번엔 모든 시/도에 대해서 적용해 봅니다. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for do in tqdm(do_names):\n", " # 각 지역도 입력.\n", "\n", " \n", " # 도마다 구 명단 가져오기.\n", " \n", " \n", " \n", " for gu in tqdm(gu_names):\n", " \n", " \n", " \n", " # 도 단위별 엑셀파일 만들기.\n", " \n", " \n", " " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.12" } }, "nbformat": 4, "nbformat_minor": 1 }