데이터 연결
concat
(참고링크)를 이용한다. 이 경우 단순히 데이터프레임을 연결하는 것이다. 이때 여러 매개변수를 이용할 수 있다.
objs
는 연결할 데이터프레임 혹은 시리즈의 리스트나 딕셔너리를 입력받는다.
axis
는 연결할 축을 설정한다. 기본은 0
으로 세로로 연결하는데, 1
로 설정하면 가로로 연결한다.
join
은 연결할 때의 방식을 설정한다. 기본은 "outer"
로 설정되어 있는데, 이 경우 모든 인덱스 혹은 열을 합쳐서 연결한다. 만약 "inner"
로 설정하면 교집합만 연결한다.
ignore_index
는 연결 후 새로운 인덱스 부여 여부를 결정한다. 기본적으로 False
로 되어 있어 인덱스가 바뀌지 않지만, True
로 설정하면 인덱스를 새롭게 설정한다.
verify_integrity
는 연결하려는 각 데이터프레임의 인덱스가 중복되지 않는지 확인한다. 기본적으로는 False
로 되어 있어 확인하지 않지만, True
로 바꿔주면 중복된 인덱스가 있는 경우 오류를 발생시킨다.
sort
는 연결하는 열이나 인덱스를 정렬한다. 기본적으로는 False
로 되어 있어 정렬하지 않지만, True
로 설정하면 정렬한다. axis
가 0
이면, 즉 세로로 연결할 때는 열을 정렬하고, axis
가 1
이면, 즉 가로로 연결할 때는 인덱스를 정렬한다.
key
, levels
, names
는 다중 인덱스(MultiIndex)를 사용하는 경우에 사용하는데, 자세한 내용은 위 concat
레퍼런스를 참고하면 된다.
예를 들어 아래와 같은 데이터가 있다고 해보자.
import pandas as pd
df1 = pd.DataFrame({
'B': [3, 4],
'A': [1, 2]
}, index=[2, 1])
df2 = pd.DataFrame({
'C': [7, 8],
'B': [5, 6]
}, index=[1, 0])
간단하게 세로로 연결해보자.
result = pd.concat([df1, df2])
result
를 출력하면 아래와 같다.
B A C
2 3 1.0 NaN
1 4 2.0 NaN
1 5 NaN 7.0
0 6 NaN 8.0
똑같이 세로로 연결하면서 인덱스를 재설정하고, 정렬해보자.
result = pd.concat([df1, df2], ignore_index=True, sort=True)
result
를 출력하면 아래와 같다.
A B C
0 1.0 3 NaN
1 2.0 4 NaN
2 NaN 5 7.0
3 NaN 6 8.0
그냥 연결한 것과 달리 열이 정렬되었고, 인덱스가 재설정되었다.
이번에는 가로로 연결해보자.
result = pd.concat([df1, df2], axis=1)
그렇다면 result
는 아래와 같다.
B A C B
2 3.0 1.0 NaN NaN
1 4.0 2.0 7.0 5.0
0 NaN NaN 8.0 6.0
이때 정렬한다면 열이 아니라 인덱스가 정렬된다. 또한 verify_integrity
를 True
로 설정한다면 오류가 발생할 것이다.
join
을 "inner"
로 설정할 수도 있다.
result = pd.concat([df1, df2], axis=1, join="inner")
result
는 아래와 같다.
B A C B
1 4 2 7 5
데이터 결합
merge
(참고링크)를 이용한다. 단순 데이터연결이 아니라 중복되는 열을 기준으로 결합한다. 이때 여러가지 매개변수를 활용할 수 있다.
right
는 결합하려는 보조 데이터프레임이다.
how
는 결합하는 방식으로 기본적으론 주 데이터와 보조 데이터의 교집합만 가져오는 "inner"
로 설정되어 있지만, 합집합 방식의 "outer"
와 주 데이터의 열을 사용하는 "left"
, 보조 데이터의 열을 사용하는 "right"
로도 설정 가능하다. 교차 결합을 수행하는 "cross"
로도 설정 가능하다.
on
은 결합 기준이 되는 열의 이름을 지정하도록 하는 것이다.
left_on
, right_on
을 통해 주 데이터, 보조 데이터에서 결합할 열을 지정할 수도 있다.
left_index
, right_index
를 통해 주 데이터, 보조 데이터를 인덱스를 기준으로 결합하고자 할 때 사용한다. 만약 두 데이터 모두 인덱스로 결합한다면 모두 True
로 설정하면 된다. 기본값은 False
이다.
sort
는 기본값이 False
인데, True
로 설정하면 데이터프레임을 정렬한다. 이때 정렬하는 기준 열은 on
으로 설정된 열이다.
suffixes
는 같은 이름의 열이 있을 때 열의 이름을 구분하는 것으로, 뒤에 붙일 이름을 리스트로 넣는다. 기본적으로는 "_x"
와 "_y"
로 설정되어 있다.
indicator
를 설정하여 데이터의 원본 데이터를 표시할 수도 있다.
그 외에도 copy
, validate
를 설정할 수 있는데, 자세한 내용은 위 merge
의 레퍼런스를 참고하면 된다.
예를 들어서 아래와 같은 데이터가 있다고 해보자.
import pandas as pd
customers = pd.DataFrame({
'customer_id': [1, 2, 3, 4],
'name': ['Alice', 'Bob', 'Charlie', 'Diana'],
'city': ['New York', 'Los Angeles', 'Chicago', 'Houston']
})
orders = pd.DataFrame({
'order_id': [101, 102, 103, 104],
'customer_id': [3, 4, 4, 5],
'amount': [250, 450, 300, 150]
})
가장 기본적으로 두 데이터를 결합해보자.
result = customers.merge(orders)
그렇다면 result
는 다음과 같다.
customer_id name city order_id amount
0 3 Charlie Chicago 101 250
1 4 Diana Houston 102 450
2 4 Diana Houston 103 300
두 데이터의 공통 부분인 customer_id를 기준으로 결합된 것이다. 주의해야 할 것은 이 경우 공통된 열이 하나밖에 없었기 때문에 정상적으로 결합되었지만, 공통된 열이 두 개 이상인 경우 모든 열의 값이 같아야 해당 결합이 정상적으로 진행된다. 만약 기준 열이 두 개 이상인데, 기준 열에서 서로 다른 값이 발생하면 그 행은 처리하지 않는다.
위 데이터는 기본값인 "inner"
를 기준으로 결합된 것인데, 이제 "outer"
를 기준으로 결합해보자. 이번에는 명시적으로 기준 데이터를 설정하겠다.
result = customers.merge(orders, on='customer_id', how='outer')
result
는 아래와 같다.
customer_id name city order_id amount
0 1 Alice New York NaN NaN
1 2 Bob Los Angeles NaN NaN
2 3 Charlie Chicago 101.0 250.0
3 4 Diana Houston 102.0 450.0
4 4 Diana Houston 103.0 300.0
5 5 NaN NaN 104.0 150.0
겹치지 않는, 즉 결측치가 있는 데이터까지 결합하였다.
이제 "left"
, 즉 주 데이터를 기준으로 결합해보자.
result = customers.merge(orders, on='customer_id', how='left')
result
는 아래와 같다.
customer_id name city order_id amount
0 1 Alice New York NaN NaN
1 2 Bob Los Angeles NaN NaN
2 3 Charlie Chicago 101.0 250.0
3 4 Diana Houston 102.0 450.0
4 4 Diana Houston 103.0 300.0
주 데이터에 있는 customer_id 정보에 대해서만 결합이 이루어졌다. id가 5인 손님에 대한 정보는 보조 데이터에만 있었기 때문에 추가되지 않았다.
이제 "right"
, 즉 보조 데이터를 기준으로 결합해보자.
result = customers.merge(orders, on='customer_id', how='right')
result
는 아래와 같다.
customer_id name city order_id amount
0 3 Charlie Chicago 101 250
1 4 Diana Houston 102 450
2 4 Diana Houston 103 300
3 5 NaN NaN 104 150
보조 데이터에 있는 customer_id 정보에 대해서만 결합이 이루어졌다. id가 1, 2인 손님에 대한 정보는 주 데이터에만 있었기 때문에 추가되지 않았다.
만약 데이터가 아래와 같다고 가정하자.
import pandas as pd
customers = pd.DataFrame({
'id': [1, 2, 3, 4],
'name': ['Alice', 'Bob', 'Charlie', 'Diana'],
'city': ['New York', 'Los Angeles', 'Chicago', 'Houston']
})
orders = pd.DataFrame({
'order_id': [101, 102, 103, 104],
'customer_id': [3, 4, 4, 5],
'amount': [250, 450, 300, 150]
})
이 경우 서로 id에 대한 이름이 다르다. customers
에는 "id"
로 설정되어 있는데 orders
에는 "customer_id"
로 설정되어 있다. 이 경우에 left_on
, right_on
을 사용한다.
result = customers.merge(orders, left_on='id', right_on='customer_id')
이렇게 결합해준다면 result
는 아래와 같다.
id name city order_id customer_id amount
0 3 Charlie Chicago 101 3 250
1 4 Diana Houston 102 4 450
2 4 Diana Houston 103 4 300
만약 left_on
과 right_on
을 설정하지 않는다면 공통된 열이 없기 때문에 오류가 뜰 것이다.
left_index
와 right_index
를 통해서 인덱스 기준으로 결합도 가능하지만, 간단하게 하려면 join
을 이용하는 것이 더 편하니 아래를 참고하면 좋다.
데이터 간단 결합
join
(참고링크)을 이용한다. 단순 데이터연결이 아니라 중복되는 인덱스를 기준으로 결합한다. 이때 여러가지 매개변수를 활용할 수 있고, 많은 부분이 merge
와 비슷하다.
other
는 결합하려는 다른 데이터이다.
on
, how
, sort
는 위 merge
를 참고하면 좋고, lsuffix
, rsuffix
도 위 merge
의 suffixes
를 참고하면 된다.
validate
는 결합 유형의 유효성을 확인하는 설정으로 자세한 내용은 레퍼런스를 참고하면 된다.
주로 인덱스를 기준으로 병합되기 때문에 인덱스가 단순히 0, 1, ..., n이 아니라 고유번호, 날짜 등 정보가 있는 경우에 주로 사용된다. 물론 앞선 merge
에서 left_index
, right_index
매개변수를 이용해도 결합이 가능하지만, join
을 이용하는 것이 간단한 경우가 많다.
예를 들어 아래와 같은 데이터가 있다고 해보자.
import pandas as pd
df1 = pd.DataFrame({'income': [1, 2, 3]}, index=[2019, 2020, 2021])
df2 = pd.DataFrame({'expense': [4, 5, 6]}, index=[2020, 2021, 2022]
이제 간단히 결합해보자.
result = df1.join(df2)
그렇다면 result
는 아래와 같다.
income expense
2020 2 4
2021 3 5
결합 방식을 "outer"
로 바꿔 확인해보자.
result = df1.join(df2, how='outer')
그렇다면 result
는 아래와 같다.
income expense
2019 1.0 NaN
2020 2.0 4.0
2021 3.0 5.0
2022 NaN 6.0
'Data Science > Pandas' 카테고리의 다른 글
[Pandas] 값 혹은 인덱스를 기준으로 데이터프레임 정렬 (0) | 2024.12.29 |
---|---|
[Pandas] 판다스를 통한 데이터 시각화(data visualization) (0) | 2024.12.28 |
[Pandas] 데이터프레임 기초 통계량 확인 (0) | 2024.12.26 |
[Pandas] 데이터 정보 확인과 미리보기 및 결측치 확인과 처리 (0) | 2024.12.25 |
[Pandas] 판다스 csv, 엑셀(xlsx, xls) 불러오기 및 저장하기 (0) | 2024.12.25 |