05-3
데이터 연결 마무리¶
판다스는 데이터 연결 전용 메서드인 merge를 제공한다. merge 메서드의 사용 방법을 ㅅㄹ습하면서 데이터 연결을 마무리하겠다.
merge 메서드 사용하기¶
- 다음은 특정 위치의 날씨 정보에 필요한 데이터 집합을 모두 불러온 것이다. person은 관측한 사람의 이름, site는 관측 위치, visited는 관측 날짜, survey는 날씨 정보이다.
In [2]:
import pandas as pd
person = pd.read_csv('doit_pandas_data/data/survey_person.csv')
site = pd.read_csv('doit_pandas_data/data/survey_site.csv')
survey = pd.read_csv('doit_pandas_data/data/survey_survey.csv')
visited = pd.read_csv('doit_pandas_data/data/survey_visited.csv')
In [3]:
print(person)
ident personal family 0 dyer William Dyer 1 pb Frank Pabodie 2 lake Anderson Lake 3 roe Valentina Roerich 4 danforth Frank Danforth
In [4]:
print(site)
name lat long 0 DR-1 -49.85 -128.57 1 DR-3 -47.15 -126.72 2 MSK-4 -48.87 -123.40
In [5]:
print(survey)
taken person quant reading 0 619 dyer rad 9.82 1 619 dyer sal 0.13 2 622 dyer rad 7.80 3 622 dyer sal 0.09 4 734 pb rad 8.41 5 734 lake sal 0.05 6 734 pb temp -21.50 7 735 pb rad 7.22 8 735 NaN sal 0.06 9 735 NaN temp -26.00 10 751 pb rad 4.35 11 751 pb temp -18.50 12 751 lake sal 0.10 13 752 lake rad 2.19 14 752 lake sal 0.09 15 752 lake temp -16.00 16 752 roe sal 41.60 17 837 lake rad 1.46 18 837 lake sal 0.21 19 837 roe sal 22.50 20 844 roe rad 11.25
In [6]:
print(visited)
ident site dated 0 619 DR-1 1927-02-08 1 622 DR-1 1927-02-10 2 734 DR-3 1939-01-07 3 735 DR-3 1930-01-12 4 751 DR-3 1930-02-26 5 752 DR-3 NaN 6 837 MSK-4 1932-01-14 7 844 DR-1 1932-03-22
- visited 데이터프레임의 일부 데이터만 떼어 실습에 사용하겠다.
In [8]:
visited_subset = visited.loc[[0, 2, 6]]
- merge 메서드는 기본적으로 내부 조인을 실행하며 메서드를 사용한 데이터프레임(site)을 왼쪽으로 지정하고 첫 번째 인잣값으로 지정한 데이터프레임(visited_subset)을 오른쪽으로 지정한다. left_on, right_on 인자는 값이 일치해야 할 왼쪽과 오른쪽 데이터프레임의 열을 지정한다. 즉, 왼쪽 데이터프레임(site)이 열(name)과 오른쪽 데이터프레임 (visited)의 열(site)의 값이 일치하면 왼쪽 데이터프레임을 기준으로 연결한다.
In [10]:
o2o_merge = site.merge(visited_subset, left_on='name', right_on='site')
print(o2o_merge)
name lat long ident site dated 0 DR-1 -49.85 -128.57 619 DR-1 1927-02-08 1 DR-3 -47.15 -126.72 734 DR-3 1939-01-07 2 MSK-4 -48.87 -123.40 837 MSK-4 1932-01-14
- 다음은 site, visited 데이터프레임을 이용하여 데이터를 연결한 것이다.
In [11]:
m2o_merge = site.merge(visited, left_on='name', right_on='site')
print(m2o_merge)
name lat long ident site dated 0 DR-1 -49.85 -128.57 619 DR-1 1927-02-08 1 DR-1 -49.85 -128.57 622 DR-1 1927-02-10 2 DR-1 -49.85 -128.57 844 DR-1 1932-03-22 3 DR-3 -47.15 -126.72 734 DR-3 1939-01-07 4 DR-3 -47.15 -126.72 735 DR-3 1930-01-12 5 DR-3 -47.15 -126.72 751 DR-3 1930-02-26 6 DR-3 -47.15 -126.72 752 DR-3 NaN 7 MSK-4 -48.87 -123.40 837 MSK-4 1932-01-14
- 다른 데이터프레임도 연결해보자. 다음은 person, survey 데이터프레임과 visited, survey 데이터프레임을 merge 메서드로 연결한 것이다.
In [12]:
ps = person.merge(survey, left_on='ident', right_on='person')
vs = visited.merge(survey, left_on='ident', right_on='taken')
print(ps)
ident personal family taken person quant reading 0 dyer William Dyer 619 dyer rad 9.82 1 dyer William Dyer 619 dyer sal 0.13 2 dyer William Dyer 622 dyer rad 7.80 3 dyer William Dyer 622 dyer sal 0.09 4 pb Frank Pabodie 734 pb rad 8.41 5 pb Frank Pabodie 734 pb temp -21.50 6 pb Frank Pabodie 735 pb rad 7.22 7 pb Frank Pabodie 751 pb rad 4.35 8 pb Frank Pabodie 751 pb temp -18.50 9 lake Anderson Lake 734 lake sal 0.05 10 lake Anderson Lake 751 lake sal 0.10 11 lake Anderson Lake 752 lake rad 2.19 12 lake Anderson Lake 752 lake sal 0.09 13 lake Anderson Lake 752 lake temp -16.00 14 lake Anderson Lake 837 lake rad 1.46 15 lake Anderson Lake 837 lake sal 0.21 16 roe Valentina Roerich 752 roe sal 41.60 17 roe Valentina Roerich 837 roe sal 22.50 18 roe Valentina Roerich 844 roe rad 11.25
In [13]:
print(vs)
ident site dated taken person quant reading 0 619 DR-1 1927-02-08 619 dyer rad 9.82 1 619 DR-1 1927-02-08 619 dyer sal 0.13 2 622 DR-1 1927-02-10 622 dyer rad 7.80 3 622 DR-1 1927-02-10 622 dyer sal 0.09 4 734 DR-3 1939-01-07 734 pb rad 8.41 5 734 DR-3 1939-01-07 734 lake sal 0.05 6 734 DR-3 1939-01-07 734 pb temp -21.50 7 735 DR-3 1930-01-12 735 pb rad 7.22 8 735 DR-3 1930-01-12 735 NaN sal 0.06 9 735 DR-3 1930-01-12 735 NaN temp -26.00 10 751 DR-3 1930-02-26 751 pb rad 4.35 11 751 DR-3 1930-02-26 751 pb temp -18.50 12 751 DR-3 1930-02-26 751 lake sal 0.10 13 752 DR-3 NaN 752 lake rad 2.19 14 752 DR-3 NaN 752 lake sal 0.09 15 752 DR-3 NaN 752 lake temp -16.00 16 752 DR-3 NaN 752 roe sal 41.60 17 837 MSK-4 1932-01-14 837 lake rad 1.46 18 837 MSK-4 1932-01-14 837 lake sal 0.21 19 837 MSK-4 1932-01-14 837 roe sal 22.50 20 844 DR-1 1932-03-22 844 roe rad 11.25
- left_on, right_on에 전달하는 값은 여러 개라도 상관이 없다. 다음과 같이 여러 개의 열 이름을 리스트에 담아 전달해도 된다. 다음은 ps 데이터프레임의 ident, taken, quant, reading 열의 값과 vs 데이터프레임의 person, ident, quant, reading 열의 값을 이용하여 ps와 vs 데이터프레임을 서로 연결한 것이다.
In [15]:
ps_vs = ps.merge(vs, left_on=['ident', 'taken', 'quant', 'reading'],
right_on=['person', 'ident', 'quant', 'reading'])
- 과정 6에서 연결한 ps_vs 데이터프레임의 첫 번째 행을 살펴보면 양쪽 데이터프레임에 있었던 중복된 열 이름(ident, taken, person)에 접미사 _x, _y가 추가되어 있는 것을 알 수 있다. _x는 왼쪽 데이터프레임의 열을 의미하고 _Y는 오른쪽 데이터프레임의 열을 의미한다.
In [16]:
print(ps_vs.loc[0,])
ident_x dyer personal William family Dyer taken_x 619 person_x dyer quant rad reading 9.82 ident_y 619 site DR-1 dated 1927-02-08 taken_y 619 person_y dyer Name: 0, dtype: object
마무리하며
이 장에서는 데이터를 연결하는 다양한 방법을 알아보았다. 특히 누락값과 중복값을 해결하기 위한 여러 가지 방법에 대해 알아보았다. 누락값과 중복값은 데이터 분석을 방해하는 요소가 될 수 있기 때문이다. 05장을 시작하며 소개한 깔끔한 데이터의 조건 중 하나인 '데이터 분석 목적에 맞는 데이터를 모아 새로운 표(Table)을 만들어야 한다'는 바로 누락값이나 중복값이 없는 상태로 데이터가 잘 연결되어 있어야 한다는 말이다.
출처 : Do it! 데이터 분석을 위한 판다스
'Python > Pandas' 카테고리의 다른 글
<파이썬 판다스> Chapter 07-1 열과 피벗 (1) | 2023.05.06 |
---|---|
<파이썬 판다스> Chapter 06-1 누락값 처리하기 (0) | 2023.05.04 |
<파이썬 판다스> Chapter 05-2 데이터 연결 기초 (0) | 2023.05.02 |
<파이썬 판다스> Chapter 05-1 분석하기 좋은 데이터 (0) | 2023.05.02 |
<파이썬 판다스> Chapter 04-5 seaborn 라이브러리로 그래프 스타일 설정하기 (0) | 2023.04.30 |