일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- GridSearchCV
- dataframe
- 결정계수
- RegressionTree
- 분류
- OrdinalEncoder
- LinearRegression
- 다중선형회귀분석
- scikitlearn
- 하이퍼파라미터
- 데이터분석
- machinelearning
- 딥러닝
- 시계열 데이터
- 비지도학습
- time series
- DataScience
- 데이터전처리
- 잔차분석
- 시계열데이터
- deeplearning
- 손실함수
- LogisticRegression
- 로지스틱회귀분석
- 지도학습
- 선형회귀분석
- 단순선형회귀분석
- Python
- 의사결정나무
- ML
- Today
- Total
IE가 어른이 되기까지
[Python] 판다스 (Pandas) 의 DataFrame 조인 및 연결하기 본문
DataFrame 조인
Pandas의 가장 강력한 기능 중 하나는
DataFrame에 대해 SQL과 같은 조인 (join) 을 수행할 수 있다는 점입니다.
조인 (join) 으로 우리는 두 개의 DataFrame을 연결하여
하나의 DataFrame으로 사용할 수 있습니다.
import pandas as pd
city_loc = pd.DataFrame(
[
["CA", "San Francisco", 37.781334, -122.416728],
["NY", "New York", 40.705649, -74.008344],
["FL", "Miami", 25.791100, -80.320733],
["OH", "Cleveland", 41.473508, -81.739791],
["UT", "Salt Lake City", 40.755851, -111.896657]
], columns=["state", "city", "lat", "lng"])
city_loc
city_pop = pd.DataFrame(
[
[808976, "San Francisco", "California"],
[8363710, "New York", "New-York"],
[413201, "Miami", "Florida"],
[2242193, "Houston", "Texas"]
], index=[3,4,5,6], columns=["population", "city", "state"])
city_pop
조인 (join) 전,
두 DataFrame에 공통적으로 있는 열이
'city'임을 알 수 있습니다.
또한, 조인 (join) 을 하기 위해서는 'merge( )'라는
함수를 이용합니다.
지금부터 여러 종류의 조인 방법에 대해 알아보도록 하겠습니다.
1. Inner Join
Inner Join은 두 DataFrame에 있는 공통적인 관측치만 남깁니다.
pd.merge(left=city_loc, right=city_pop, on="city")
left와 right에는 join 종류별로 지정해주면 됩니다.
Inner join에서는 어떤 것으로 지정하던 상관없습니다.
on 에는 공통적으로 존재하는 변수를 입력합니다.
그 결과, 공통적으로 존재하는 'San Francisco', 'New York', 'Miami'가 출력되었습니다.
반면 공통적으로 존재하지 않았던 'Cleveland', 'Salt Lake City', 'Houston'은 삭제되었습니다.
또한, 두 DataFrame은 state란 이름의 열을 가지고 있으므로
state_x와 state_y로 이름이 변경되었습니다.
2. Outer Join
all_cities = pd.merge(left=city_loc, right=city_pop, on="city", how="outer")
all_cities
Outer join은 공통인 행과 공통이 아닌 행까지 모두 출력합니다.
다만, 존재하지 않는 행에는 NaN으로 채웁니다.
즉, 공통인 열로 두 DataFrame을 연결만 하는 방법입니다.
또한, Outer join을 실행하려면 Inner join과 달리 'how'라는 옵션을 통해
지정해주어야 합니다.
3. Left Outer Join
pd.merge(left=city_loc, right=city_pop, on="city", how="left")
Left Outer Join은 how에 left를 씀으로써
실행시킬 수 있습니다.
이 경우엔 inner과 outer과 달리 left와 right를
잘 지정해주어야 합니다.
결과를 보면 왼쪽의 DataFrame에 있는 관측치만 남았음을 알 수 있습니다.
또한, right에 없던 'Cleveland'와 'Salt Lake City'는 NaN으로 채워졌음을
알 수 있습니다.
4. Right Outer Join
pd.merge(left=city_loc, right=city_pop, on="city", how="right")
Right Outer Join은 how에 right를 씀으로써
실행시킬 수 있습니다.
결과를 보면 오른쪽의 DataFrame에 있는 관측치만 남았음을 알 수 있습니다.
또한, left에 없던 'Houston'은 NaN으로 채워졌음을
알 수 있습니다.
DataFrame 연결
조인 (Join) 은 두 DataFrame을 연결하는 공통적인 변수가 존재했던 반면
연결은 변수 이름에 맞추어 그냥 붙여주게 됩니다.
연결에는 수직으로 연결하는 방식과
수평으로 연결하는 방식이 있습니다.
쉽게 말하자면 수직으로 연결하는 경우
한 DataFrame이 다른 DataFrame의 행 방향에 연결되고
수평으로 연결하면 열 방향으로 연결됩니다.
1. 수직 연결 - concat 함수
result_concat = pd.concat([city_loc, city_pop])
result_concat
결과를 보면 공통적으로 존재하는 'state'와 'city'를 기준으로
연결되었으며 index 값을 유지한 채로 행에 추가되었음을 알 수 있습니다.
즉, 두 DataFrame이 수직으로 연결되었습니다.
pd.concat([city_loc, city_pop], ignore_index=True)
index 값을 무시하기 위해선
ignore_index = True 를 지정해주면 됩니다.
pd.concat([city_loc, city_pop], join="inner")
또한, concat으로도 inner join을 실행할 수 있습니다.
join을 inner으로 설정하면 두 DataFrame에 존재했던
'state'와 'city' 열만 반환되었음을 알 수 있습니다.
2. 수직 연결 - append 함수
city_loc.append(city_pop)
concat이 아닌 append 함수로도 똑같이
두 DataFrame을 수직으로 연결할 수 있습니다.
3. 수평 연결 - concat 함수
pd.concat([city_loc, city_pop], axis=1)
수평으로 연결하기 위해선
axis = 1을 설정해주면 됩니다.
이 경우, 동일한 index를 기준으로 연결되기 때문에
city_pop이 city_loc 데이터 프레임의 3번 행부터 연결됩니다.
하지만 이렇게 생성된 DataFrame은 의미가 없기 때문에
DataFrame을 연결하기 전 'city'를 인덱스로 지정한 후 연결하고자 합니다.
pd.concat([city_loc.set_index("city"), city_pop.set_index("city")], axis=1)
결과적으로 Full Outer Join을 수행한 것과 비슷하지만
state열이 Full Outer Join 처럼 state_x, state_y로 바뀌지 않고
city열이 index가 되었음을 알 수 있습니다.
'DATA SCIENCE > Python' 카테고리의 다른 글
[Python] 판다스 (Pandas) 의 DataFrame 다루기 (0) | 2023.01.04 |
---|---|
[Python] 판다스 (Pandas) 의 DataFrame 결측치 처리하기 (0) | 2023.01.04 |
[Python] 판다스 (Pandas) 의 DataFrame 그룹핑하기 (0) | 2023.01.04 |
[Python] 판다스 (Pandas) 의 DataFrame 연산하기 (0) | 2023.01.04 |
[Python] 판다스 (Pandas) 의 DataFrame 정렬하기 (0) | 2023.01.04 |