반응형
모듈 import¶
In [1]:
!pip install seaborn==0.13.0
Defaulting to user installation because normal site-packages is not writeable Collecting seaborn==0.13.0 Downloading seaborn-0.13.0-py3-none-any.whl (294 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 294.6/294.6 kB 4.4 MB/s eta 0:00:00a 0:00:01 Requirement already satisfied: numpy!=1.24.0,>=1.20 in ./.local/lib/python3.9/site-packages (from seaborn==0.13.0) (1.23.3) Requirement already satisfied: pandas>=1.2 in ./.local/lib/python3.9/site-packages (from seaborn==0.13.0) (1.4.2) Requirement already satisfied: matplotlib!=3.6.1,>=3.3 in ./.local/lib/python3.9/site-packages (from seaborn==0.13.0) (3.6.0) Requirement already satisfied: pyparsing>=2.2.1 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (3.0.9) Requirement already satisfied: kiwisolver>=1.0.1 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (1.4.4) Requirement already satisfied: contourpy>=1.0.1 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (1.0.6) Requirement already satisfied: fonttools>=4.22.0 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (4.38.0) Requirement already satisfied: cycler>=0.10 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (0.11.0) Requirement already satisfied: packaging>=20.0 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (21.3) Requirement already satisfied: python-dateutil>=2.7 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (2.8.2) Requirement already satisfied: pillow>=6.2.0 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (9.3.0) Requirement already satisfied: pytz>=2020.1 in ./.local/lib/python3.9/site-packages (from pandas>=1.2->seaborn==0.13.0) (2022.5) Requirement already satisfied: six>=1.5 in ./.local/lib/python3.9/site-packages (from python-dateutil>=2.7->matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (1.16.0) Installing collected packages: seaborn Attempting uninstall: seaborn Found existing installation: seaborn 0.12.0 Uninstalling seaborn-0.12.0: Successfully uninstalled seaborn-0.12.0 Successfully installed seaborn-0.13.0 [notice] A new release of pip available: 22.2.2 -> 24.1.1 [notice] To update, run: pip install --upgrade pip
In [2]:
from IPython.display import Image
import numpy as np
import pandas as pd
import seaborn as sns
import warnings
# 경고 무시
warnings.filterwarnings('ignore')
데이터셋 로드¶
In [3]:
from opendata import dataset
In [4]:
# 유가정보 데이터 다운로드
dataset.download('유가정보')
======= 다운로드 시작 ======= data/gas_first_2019.csv
0%| | 0.00/10.2M [00:00<?, ?B/s]
data/gas_second_2019.csv
0%| | 0.00/10.2M [00:00<?, ?B/s]
======= 다운로드 완료 =======
1월 부터 6월 까지 상반기 데이터 로드
In [5]:
gas1 = pd.read_csv('data/gas_first_2019.csv', encoding='euc-kr')
In [6]:
print(gas1.shape)
gas1.head()
(90590, 11)
Out[6]:
번호 | 지역 | 상호 | 주소 | 기간 | 상표 | 셀프여부 | 고급휘발유 | 휘발유 | 경유 | 실내등유 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190101 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
1 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190102 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
2 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190103 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
3 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190104 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
4 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190105 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
In [7]:
gas2 = pd.read_csv('data/gas_second_2019.csv', encoding='euc-kr')
7월 부터 12월 까지 하반기 데이터 로드
In [8]:
print(gas2.shape)
gas2.head()
(91124, 11)
Out[8]:
번호 | 지역 | 상호 | 주소 | 기간 | 상표 | 셀프여부 | 고급휘발유 | 휘발유 | 경유 | 실내등유 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190701 | SK에너지 | 셀프 | 1777 | 1577 | 1477 | 0 |
1 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190702 | SK에너지 | 셀프 | 1777 | 1577 | 1477 | 0 |
2 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190703 | SK에너지 | 셀프 | 1777 | 1577 | 1477 | 0 |
3 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190704 | SK에너지 | 셀프 | 1777 | 1577 | 1477 | 0 |
4 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190705 | SK에너지 | 셀프 | 1777 | 1577 | 1477 | 0 |
In [9]:
pd.concat([gas1, gas2])
Out[9]:
번호 | 지역 | 상호 | 주소 | 기간 | 상표 | 셀프여부 | 고급휘발유 | 휘발유 | 경유 | 실내등유 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190101 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
1 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190102 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
2 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190103 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
3 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190104 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
4 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190105 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
91119 | A0032659 | 서울 중랑구 | 지에스칼텍스㈜ 소망주유소 | 서울 중랑구 망우로 475 | 20191227 | GS칼텍스 | 셀프 | 0 | 1540 | 1389 | 1100 |
91120 | A0032659 | 서울 중랑구 | 지에스칼텍스㈜ 소망주유소 | 서울 중랑구 망우로 475 | 20191228 | GS칼텍스 | 셀프 | 0 | 1540 | 1389 | 1100 |
91121 | A0032659 | 서울 중랑구 | 지에스칼텍스㈜ 소망주유소 | 서울 중랑구 망우로 475 | 20191229 | GS칼텍스 | 셀프 | 0 | 1540 | 1389 | 1100 |
91122 | A0032659 | 서울 중랑구 | 지에스칼텍스㈜ 소망주유소 | 서울 중랑구 망우로 475 | 20191230 | GS칼텍스 | 셀프 | 0 | 1540 | 1389 | 1100 |
91123 | A0032659 | 서울 중랑구 | 지에스칼텍스㈜ 소망주유소 | 서울 중랑구 망우로 475 | 20191231 | GS칼텍스 | 셀프 | 0 | 1540 | 1389 | 1100 |
181714 rows × 11 columns
연결시 위와 같이 index가 초기화가 되지 않아 전체 DataFrame의 개수와 index가 맞지 않는 모습입니다.
In [10]:
pd.concat([gas1, gas2]).iloc[90588:90593]
Out[10]:
번호 | 지역 | 상호 | 주소 | 기간 | 상표 | 셀프여부 | 고급휘발유 | 휘발유 | 경유 | 실내등유 | |
---|---|---|---|---|---|---|---|---|---|---|---|
90588 | A0032659 | 서울 중랑구 | 지에스칼텍스㈜ 소망주유소 | 서울 중랑구 망우로 475 | 20190629 | GS칼텍스 | 셀프 | 0 | 1529 | 1389 | 0 |
90589 | A0032659 | 서울 중랑구 | 지에스칼텍스㈜ 소망주유소 | 서울 중랑구 망우로 475 | 20190630 | GS칼텍스 | 셀프 | 0 | 1529 | 1389 | 0 |
0 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190701 | SK에너지 | 셀프 | 1777 | 1577 | 1477 | 0 |
1 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190702 | SK에너지 | 셀프 | 1777 | 1577 | 1477 | 0 |
2 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190703 | SK에너지 | 셀프 | 1777 | 1577 | 1477 | 0 |
연결 하면서 index를 무시하고 연결 할 수 있습니다.
In [11]:
gas = pd.concat([gas1, gas2], ignore_index=True)
gas
Out[11]:
번호 | 지역 | 상호 | 주소 | 기간 | 상표 | 셀프여부 | 고급휘발유 | 휘발유 | 경유 | 실내등유 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190101 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
1 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190102 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
2 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190103 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
3 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190104 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
4 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190105 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
181709 | A0032659 | 서울 중랑구 | 지에스칼텍스㈜ 소망주유소 | 서울 중랑구 망우로 475 | 20191227 | GS칼텍스 | 셀프 | 0 | 1540 | 1389 | 1100 |
181710 | A0032659 | 서울 중랑구 | 지에스칼텍스㈜ 소망주유소 | 서울 중랑구 망우로 475 | 20191228 | GS칼텍스 | 셀프 | 0 | 1540 | 1389 | 1100 |
181711 | A0032659 | 서울 중랑구 | 지에스칼텍스㈜ 소망주유소 | 서울 중랑구 망우로 475 | 20191229 | GS칼텍스 | 셀프 | 0 | 1540 | 1389 | 1100 |
181712 | A0032659 | 서울 중랑구 | 지에스칼텍스㈜ 소망주유소 | 서울 중랑구 망우로 475 | 20191230 | GS칼텍스 | 셀프 | 0 | 1540 | 1389 | 1100 |
181713 | A0032659 | 서울 중랑구 | 지에스칼텍스㈜ 소망주유소 | 서울 중랑구 망우로 475 | 20191231 | GS칼텍스 | 셀프 | 0 | 1540 | 1389 | 1100 |
181714 rows × 11 columns
합치고자 하는 데이터프레임의 일부 컬럼이 누락되거나 순서가 바뀌어도 알아서 같은 컬럼끼리 병합합니다.
In [12]:
gas11 = gas1[['지역', '주소', '상호', '상표', '휘발유']]
gas22 = gas2[['상표', '번호', '지역', '상호', '주소', '경유', '휘발유']]
In [13]:
gas11.head()
Out[13]:
지역 | 주소 | 상호 | 상표 | 휘발유 | |
---|---|---|---|---|---|
0 | 서울 강남구 | 서울 강남구 논현로 640 | (주)동하힐탑셀프주유소 | SK에너지 | 1465 |
1 | 서울 강남구 | 서울 강남구 논현로 640 | (주)동하힐탑셀프주유소 | SK에너지 | 1465 |
2 | 서울 강남구 | 서울 강남구 논현로 640 | (주)동하힐탑셀프주유소 | SK에너지 | 1465 |
3 | 서울 강남구 | 서울 강남구 논현로 640 | (주)동하힐탑셀프주유소 | SK에너지 | 1465 |
4 | 서울 강남구 | 서울 강남구 논현로 640 | (주)동하힐탑셀프주유소 | SK에너지 | 1465 |
In [14]:
gas22.head()
Out[14]:
상표 | 번호 | 지역 | 상호 | 주소 | 경유 | 휘발유 | |
---|---|---|---|---|---|---|---|
0 | SK에너지 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 1477 | 1577 |
1 | SK에너지 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 1477 | 1577 |
2 | SK에너지 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 1477 | 1577 |
3 | SK에너지 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 1477 | 1577 |
4 | SK에너지 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 1477 | 1577 |
In [15]:
pd.concat([gas11, gas22], ignore_index=True)
Out[15]:
지역 | 주소 | 상호 | 상표 | 휘발유 | 번호 | 경유 | |
---|---|---|---|---|---|---|---|
0 | 서울 강남구 | 서울 강남구 논현로 640 | (주)동하힐탑셀프주유소 | SK에너지 | 1465 | NaN | NaN |
1 | 서울 강남구 | 서울 강남구 논현로 640 | (주)동하힐탑셀프주유소 | SK에너지 | 1465 | NaN | NaN |
2 | 서울 강남구 | 서울 강남구 논현로 640 | (주)동하힐탑셀프주유소 | SK에너지 | 1465 | NaN | NaN |
3 | 서울 강남구 | 서울 강남구 논현로 640 | (주)동하힐탑셀프주유소 | SK에너지 | 1465 | NaN | NaN |
4 | 서울 강남구 | 서울 강남구 논현로 640 | (주)동하힐탑셀프주유소 | SK에너지 | 1465 | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... |
181709 | 서울 중랑구 | 서울 중랑구 망우로 475 | 지에스칼텍스㈜ 소망주유소 | GS칼텍스 | 1540 | A0032659 | 1389.0 |
181710 | 서울 중랑구 | 서울 중랑구 망우로 475 | 지에스칼텍스㈜ 소망주유소 | GS칼텍스 | 1540 | A0032659 | 1389.0 |
181711 | 서울 중랑구 | 서울 중랑구 망우로 475 | 지에스칼텍스㈜ 소망주유소 | GS칼텍스 | 1540 | A0032659 | 1389.0 |
181712 | 서울 중랑구 | 서울 중랑구 망우로 475 | 지에스칼텍스㈜ 소망주유소 | GS칼텍스 | 1540 | A0032659 | 1389.0 |
181713 | 서울 중랑구 | 서울 중랑구 망우로 475 | 지에스칼텍스㈜ 소망주유소 | GS칼텍스 | 1540 | A0032659 | 1389.0 |
181714 rows × 7 columns
열 방향으로 연결¶
열(column) 방향으로 연결 가능하며, axis=1
로 지정합니다.
In [16]:
# 실습을 위한 DataFrame 임의 분할
gas1 = gas.iloc[:, :5]
gas2 = gas.iloc[:, 5:]
In [17]:
gas1.head()
Out[17]:
번호 | 지역 | 상호 | 주소 | 기간 | |
---|---|---|---|---|---|
0 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190101 |
1 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190102 |
2 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190103 |
3 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190104 |
4 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190105 |
In [18]:
gas2.head()
Out[18]:
상표 | 셀프여부 | 고급휘발유 | 휘발유 | 경유 | 실내등유 | |
---|---|---|---|---|---|---|
0 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
1 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
2 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
3 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
4 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
같은 index 행끼리 연결됩니다.
In [19]:
pd.concat([gas1, gas2], axis=1)
Out[19]:
번호 | 지역 | 상호 | 주소 | 기간 | 상표 | 셀프여부 | 고급휘발유 | 휘발유 | 경유 | 실내등유 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190101 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
1 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190102 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
2 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190103 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
3 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190104 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
4 | A0006039 | 서울 강남구 | (주)동하힐탑셀프주유소 | 서울 강남구 논현로 640 | 20190105 | SK에너지 | 셀프 | 1673 | 1465 | 1365 | 0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
181709 | A0032659 | 서울 중랑구 | 지에스칼텍스㈜ 소망주유소 | 서울 중랑구 망우로 475 | 20191227 | GS칼텍스 | 셀프 | 0 | 1540 | 1389 | 1100 |
181710 | A0032659 | 서울 중랑구 | 지에스칼텍스㈜ 소망주유소 | 서울 중랑구 망우로 475 | 20191228 | GS칼텍스 | 셀프 | 0 | 1540 | 1389 | 1100 |
181711 | A0032659 | 서울 중랑구 | 지에스칼텍스㈜ 소망주유소 | 서울 중랑구 망우로 475 | 20191229 | GS칼텍스 | 셀프 | 0 | 1540 | 1389 | 1100 |
181712 | A0032659 | 서울 중랑구 | 지에스칼텍스㈜ 소망주유소 | 서울 중랑구 망우로 475 | 20191230 | GS칼텍스 | 셀프 | 0 | 1540 | 1389 | 1100 |
181713 | A0032659 | 서울 중랑구 | 지에스칼텍스㈜ 소망주유소 | 서울 중랑구 망우로 475 | 20191231 | GS칼텍스 | 셀프 | 0 | 1540 | 1389 | 1100 |
181714 rows × 11 columns
merge() - 병합¶
서로 다른 구성의 DataFrame이지만, 공통된 key값(컬럼)을 가지고 있다면 병합할 수 있습니다.
In [21]:
df1 = pd.DataFrame({
'고객명': ['박세리', '이대호', '손흥민', '김연아', '마이클조던'],
'생년월일': ['1980-01-02', '1982-02-22', '1993-06-12', '1988-10-16', '1970-03-03'],
'성별': ['여자', '남자', '남자', '여자', '남자']})
df1
Out[21]:
고객명 | 생년월일 | 성별 | |
---|---|---|---|
0 | 박세리 | 1980-01-02 | 여자 |
1 | 이대호 | 1982-02-22 | 남자 |
2 | 손흥민 | 1993-06-12 | 남자 |
3 | 김연아 | 1988-10-16 | 여자 |
4 | 마이클조던 | 1970-03-03 | 남자 |
In [22]:
df2 = pd.DataFrame({
'고객명': ['김연아', '박세리', '손흥민', '이대호', '타이거우즈'],
'연봉': ['2000원', '3000원', '1500원', '2500원', '3500원']})
df2
Out[22]:
고객명 | 연봉 | |
---|---|---|
0 | 김연아 | 2000원 |
1 | 박세리 | 3000원 |
2 | 손흥민 | 1500원 |
3 | 이대호 | 2500원 |
4 | 타이거우즈 | 3500원 |
In [23]:
pd.merge(df1, df2)
Out[23]:
고객명 | 생년월일 | 성별 | 연봉 | |
---|---|---|---|---|
0 | 박세리 | 1980-01-02 | 여자 | 3000원 |
1 | 이대호 | 1982-02-22 | 남자 | 2500원 |
2 | 손흥민 | 1993-06-12 | 남자 | 1500원 |
3 | 김연아 | 1988-10-16 | 여자 | 2000원 |
병합하는 방법 4가지¶
how
옵션 값을 지정하여 4가지 방식으로 병합을 할 수 있으며, 각기 다른 결과를 냅니다.
- how : {
left
,right
,outer
,inner
}, - default로 설정된 값은
inner
입니다.
In [24]:
# how='inner' 입니다.
pd.merge(df1, df2)
Out[24]:
고객명 | 생년월일 | 성별 | 연봉 | |
---|---|---|---|---|
0 | 박세리 | 1980-01-02 | 여자 | 3000원 |
1 | 이대호 | 1982-02-22 | 남자 | 2500원 |
2 | 손흥민 | 1993-06-12 | 남자 | 1500원 |
3 | 김연아 | 1988-10-16 | 여자 | 2000원 |
In [25]:
pd.merge(df1, df2, how='left')
Out[25]:
고객명 | 생년월일 | 성별 | 연봉 | |
---|---|---|---|---|
0 | 박세리 | 1980-01-02 | 여자 | 3000원 |
1 | 이대호 | 1982-02-22 | 남자 | 2500원 |
2 | 손흥민 | 1993-06-12 | 남자 | 1500원 |
3 | 김연아 | 1988-10-16 | 여자 | 2000원 |
4 | 마이클조던 | 1970-03-03 | 남자 | NaN |
In [26]:
pd.merge(df1, df2, how='right')
Out[26]:
고객명 | 생년월일 | 성별 | 연봉 | |
---|---|---|---|---|
0 | 김연아 | 1988-10-16 | 여자 | 2000원 |
1 | 박세리 | 1980-01-02 | 여자 | 3000원 |
2 | 손흥민 | 1993-06-12 | 남자 | 1500원 |
3 | 이대호 | 1982-02-22 | 남자 | 2500원 |
4 | 타이거우즈 | NaN | NaN | 3500원 |
In [27]:
pd.merge(df1, df2, how='outer')
Out[27]:
고객명 | 생년월일 | 성별 | 연봉 | |
---|---|---|---|---|
0 | 박세리 | 1980-01-02 | 여자 | 3000원 |
1 | 이대호 | 1982-02-22 | 남자 | 2500원 |
2 | 손흥민 | 1993-06-12 | 남자 | 1500원 |
3 | 김연아 | 1988-10-16 | 여자 | 2000원 |
4 | 마이클조던 | 1970-03-03 | 남자 | NaN |
5 | 타이거우즈 | NaN | NaN | 3500원 |
병합하려는 컬럼의 이름이 다른 경우¶
In [28]:
df1 = pd.DataFrame({
'이름': ['박세리', '이대호', '손흥민', '김연아', '마이클조던'],
'생년월일': ['1980-01-02', '1982-02-22', '1993-06-12', '1988-10-16', '1970-03-03'],
'성별': ['여자', '남자', '남자', '여자', '남자']})
df1
Out[28]:
이름 | 생년월일 | 성별 | |
---|---|---|---|
0 | 박세리 | 1980-01-02 | 여자 |
1 | 이대호 | 1982-02-22 | 남자 |
2 | 손흥민 | 1993-06-12 | 남자 |
3 | 김연아 | 1988-10-16 | 여자 |
4 | 마이클조던 | 1970-03-03 | 남자 |
In [29]:
df2 = pd.DataFrame({
'고객명': ['김연아', '박세리', '손흥민', '이대호', '타이거우즈'],
'연봉': ['2000원', '3000원', '1500원', '2500원', '3500원']})
df2
Out[29]:
고객명 | 연봉 | |
---|---|---|
0 | 김연아 | 2000원 |
1 | 박세리 | 3000원 |
2 | 손흥민 | 1500원 |
3 | 이대호 | 2500원 |
4 | 타이거우즈 | 3500원 |
left_on
과 right_on
을 지정합니다.
이름과 고객명 컬럼이 모두 drop되지 않고 살아 있음을 확인합니다.
In [30]:
pd.merge(df1, df2, left_on='이름', right_on='고객명')
Out[30]:
이름 | 생년월일 | 성별 | 고객명 | 연봉 | |
---|---|---|---|---|---|
0 | 박세리 | 1980-01-02 | 여자 | 박세리 | 3000원 |
1 | 이대호 | 1982-02-22 | 남자 | 이대호 | 2500원 |
2 | 손흥민 | 1993-06-12 | 남자 | 손흥민 | 1500원 |
3 | 김연아 | 1988-10-16 | 여자 | 김연아 | 2000원 |
제출¶
제출을 위해 아래에 새로 생성된 df1
과 df2
를 right
병합한 결과를 result_df
에 저장하세요.
In [32]:
df1 = pd.DataFrame({
'고객명': ['박세리', '이대호', '손흥민', '김연아', '마이클조던'],
'생년월일': ['1980-01-02', '1982-02-22', '1993-06-12', '1988-10-16', '1970-03-03'],
'성별': ['여자', '남자', '남자', '여자', '남자']
})
df2 = pd.DataFrame({
'고객명': ['김연아', '박세리', '손흥민', '이대호', '타이거우즈'],
'연봉': ['2000원', '3000원', '1500원', '2500원', '3500원']
})
result_df = pd.merge(df1, df2, on='고객명', how='right')
result_df
Out[32]:
고객명 | 생년월일 | 성별 | 연봉 | |
---|---|---|---|---|
0 | 김연아 | 1988-10-16 | 여자 | 2000원 |
1 | 박세리 | 1980-01-02 | 여자 | 3000원 |
2 | 손흥민 | 1993-06-12 | 남자 | 1500원 |
3 | 이대호 | 1982-02-22 | 남자 | 2500원 |
4 | 타이거우즈 | NaN | NaN | 3500원 |
반응형
'Biusiness Insight > Data Science' 카테고리의 다른 글
[Python] 데이터프레임 시각화 (0) | 2024.06.30 |
---|---|
[Python] Pandas concat, merge 실습 (0) | 2024.06.30 |
[Python] Pandas groupby, pivottable 실습 (0) | 2024.06.30 |
[Python] Pandas 고급 전처리와 피벗테이블 (0) | 2024.06.30 |
[Python] Pandas 전처리, 추가, 삭제, 데이터 변환 (0) | 2024.06.30 |