IE가 어른이 되기까지

[Python] 판다스 (Pandas) 의 DataFrame 조인 및 연결하기 본문

DATA SCIENCE/Python

[Python] 판다스 (Pandas) 의 DataFrame 조인 및 연결하기

기모랑의 초코 2023. 1. 4. 17:22

 

 

 

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

 

좌 : city_loc     우 : 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의 행 방향에 연결되고

수평으로 연결하면 열 방향으로 연결됩니다.

 

 

 

좌 : city_loc     우 : city_pop

 

 

 

 

 

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)

 

 

 

좌 : city_loc     우 : city_pop

 

수평으로 연결하기 위해선

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가 되었음을 알 수 있습니다.

 

Comments