목차
판다스의 데이터 프레임이 여러 개 있다는 것은 데이터 셋이 여러 개 존재한다는 것을 의미합니다. 데이터 분석을 잘하기 위해서는 여러 개의 데이터 셋을 하나의 데이터 셋으로 병합하는 것이 좋습니다. 이를 위해 판다스에서는 몇몇 메서드들이 존재합니다. merge, concat, join들이 그러한 역할을 해줍니다. 일반적으로 merge와 concat을 주로 사용하는데 그 용도가 조금 다릅니다. merge의 경우 두 개의 다른 형태의 데이터 셋을 병합할 때 사용하고 concat은 같은 포맷의 여러 데이터 셋을 병합할 때 사용합니다. 오늘은 우선 merge에 대한 설명을 정리해 보려고 합니다.
1. merge()의 기본 사용
데이터 분석에서는 종종 여러 개의 데이터프레임이 존재하며, 이를 병합하여 하나의 큰 데이터프레임으로 만들어 분석을 수행하는 경우가 많습니다. 예를 들어, 고객 정보와 주문 정보가 따로 저장되어 있는 데이터프레임을 병합하여 고객의 주문 이력을 파악하는 경우가 이에 해당됩니다.
merge() 메서드는 이러한 데이터프레임 병합 작업을 효율적으로 처리할 수 있도록 지원합니다. 메서드 내부에서는 두 데이터프레임을 병합할 기준이 되는 열(column)을 지정하고, 이를 기준으로 데이터를 조합하여 새로운 데이터프레임을 생성합니다. 이를 통해 분석에 필요한 데이터를 빠르게 통합하고, 이를 기반으로 보다 정확한 분석 결과를 도출할 수 있습니다. 일반적인 사용 포맷은 다음과 같습니다.
import pandas as pd
# 기본사용 포맷
pd.merge(left=df1, right=df2, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'),
copy=None, indicator=False, validate=None)
# left에 들어갈 df1을 기준으로 merge를 사용할 때
df1.merge(right=df2, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'),
copy=None, indicator=False, validate=None)
위의 두 개 포맷은 아주 약간만 다를 뿐 거의 같은 형식이라고 생각하시면 됩니다. merge의 단점으로는 위의 형식에서도 알 수 있듯이 한 번에 단 두 개의 데이터 셋만 결합할 수 있다는 겁니다. 여러 개의 데이터 셋을 병합하기 위해서는 merge를 여러 번 사용해야 합니다. 각 파라미터는 아래와 같은 의미를 갖습니다.
[기본사용]
left / right : 병합할 두 개의 데이터 프레임 입력
merge의 기본사용(두 개의 데이터 프레임만 입력, 파라미터 미 지정)의 예제 코드는 아래와 같습니다. merged_df1과 merged_df2는 모두 같은 결과값을 갖습니다.
import pandas as pd
# 첫 번째 데이터프레임
df1 = pd.DataFrame({
'key': ['A', 'B', 'C', 'D'],
'value1': [1, 2, 3, 4]})
# 두 번째 데이터프레임
df2 = pd.DataFrame({
'key': ['B', 'D', 'E', 'F'],
'value2': [5, 6, 7, 8]})
merged_df1 = pd.merge(df1, df2)
merged_df2 = df1.merge(df2)
print(df1)
# 출력 결과
# key value1 value2
# 0 B 2 5
# 1 D 4 6
2. how 파라미터 사용
[how : 병합하는 방식 (default는 inner)]
- inner : 병합 시 기준이 되는 열의 값 중에서 일치하는 값들을 기준으로 병합
- outer : 모든 값을 다 사용하여 병합
- left / right : 왼쪽 또는 오른쪽 값을 기준으로 병합
처음에는 조금 이해하기 어려운 파라미터이나 merge 메서드의 파라미터들 중에서는 가장 중요한 것 중 하나가 아닌가 합니다. 아래 예제 코드를 잘 이해해 보시기 바랍니다. 두 개의 데이터 프레임은 위에서 정의한 df1과 df2를 사용하는 것으로 가정합니다.
merged_df1 = pd.merge(df1, df2, on='key', how='outer')
merged_df2 = pd.merge(df1, df2, on='key', how='left')
merged_df3 = pd.merge(df1, df2, on='key', how='right')
print(merged_df1)
print(merged_df2)
print(merged_df3)
# 출력 결과
# key value1 value2
#0 A 1.0 NaN
#1 B 2.0 5.0
#2 C 3.0 NaN
#3 D 4.0 6.0
#4 E NaN 7.0
#5 F NaN 8.0
# key value1 value2
#0 A 1 NaN
#1 B 2 5.0
#2 C 3 NaN
#3 D 4 6.0
# key value1 value2
#0 B 2.0 5
#1 D 4.0 6
#2 E NaN 7
#3 F NaN 8
inner의 경우에는 처음 코드에서 default로 사용되어 결과를 확인했으니 이번 코드에서는 다루지 않습니다. how를 쓰기 위해서는 on을 사용하여 기준이 되는 열을 지정합니다. 이번 merge에서는 'key'열에 있는 데이터 값을 기준으로 병합하려고 했습니다. inner를 사용하게 되면 key열에서 공통으로 있는 'B'와 'D'의 값만 병합을 해서 총 2개 길이(len(merged_df))의 데이터 프레임이 생성되는 겁니다.
outer를 사용하게 되면 모든 값을 사용하기 때문에 A~F까지의 값을 left는 df1의 값만 right는 df2의 값만 기준으로 데이터를 병합합니다. 위의 예제코드의 결과값을 잘 보시면 이해가 쉽습니다.
3. left_on과 right_on의 사용
[병합 기준열 정의]
left_on / right_on : 왼쪽 데이터 프레임과 오른쪽 데이터 프레임을 병합하려고 할 때 기준 열의 key값이 다를 경우 사용
위에서 사용된 데이터 프레임 df1과 df2의 경우 'key'라는 열의 값이 동일했습니다. 만일 df1이 'key1'의 열로 정의되었고 df2가 'key2'로 되어 있다면 'on="key"'의 파라미터를 사용하지 못합니다. 이럴 때 left_on과 right_on을 사용합니다.
4. suffixes 사용
[suffixes : 데이터 열의 이름이 같을 경우 사용] : default는 _x, _y
위의 데이터 프레임 형태 이미지에서 value1과 value2가 있습니다. df1과 df2에서의 데이터 열입니다. 일반적으로 데이터 프레임별로 value1, value2를 따로 지정하지 않고 value 하나로만 관리될 겁니다. 이럴 경우 기본적으로 '_x'와 '_y'가 접미사로 붙게 되는데 다른 접미사명을 사용하고 싶을 경우 특정 값을 입력할 수 있습니다. 아래처럼 df의 데이터 열의 이름을 value로 통일했을 경우 접미사가 붙어 있는 결과값을 얻습니다.
df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'],
'value': [1, 2, 3, 4]})
df2 = pd.DataFrame({'key': ['B', 'D', 'E', 'F'],
'value': [5, 6, 7, 8]})
# 결과값
# key value_x value_y
# 0 B 2 5
# 1 D 4 6
5. left_index와 right_index
default로는 'False'로 설정되어 있으나, 'True'로 변경할 경우 두 파라미터 모두 변경해 주어야 합니다. 'on' 파라미터가 기준열의 데이터를 기준으로 병합을 했다면, 이번 파라미터들은 같은 값의 인덱스를 사용하여 병합할 때 사용합니다. 데이터셋에서 인덱스를 날짜와 같이 관리가 되는 값들이라면 특정 날짜의 데이터를 병합할 때 사용하면 유용합니다.
df1 = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6]
}, index=[100, 200, 300])
# 두 번째 데이터프레임
df2 = pd.DataFrame({
'C': [7, 8, 9],
'D': [10, 11, 12]
}, index=[200, 300, 400])
# 병합 후 결과값
# A B C D
# 200 2 5 7 10
# 300 3 6 8 11
6. 그 외의 파라미터들
위에서 설명드린 파라미터들 이외의 파라미터들은 자세한 설명을 생략하겠습니다. 그 이유는 실제적으로 잘 사용되지 않기 때문입니다. sort의 경우 데이터를 순차적으로 배치할 때, copy는 복사를 할 경우에 사용됩니다. 좀 더 어려운 validate 파라미터가 있는데, 이는 데이터 유효성을 검토할 때 사용됩니다. 다만, 유효성이 부합하지 않으면 병합하지 않고 에러를 띄우게 됩니다. 일반적인 데이터 분석 시에는 사용할 필요가 없으나, 암호관리와 같은 보안 프로그램 사용 시 적용될 수 있습니다.
7. 마치며
지금까지 두 개의 데이터 프레임을 병합해 주는 merge 메서드에 대한 사용법을 정리해 보았습니다. merge는 데이터 포맷이 다른 경우 특정한 값들만을 추출해서 병합하려는 의도가 다분히 있습니다. 무작위의 데이터 셋에서 어떠한 'Insight'를 찾는 데이터 분석에는 유용하게 사용할 수 있을 겁니다.
일반적인 수치 데이터 분석에서는 merge의 사용보다는 concat을 사용한 데이터 병합이 더 많이 사용됩니다. 일반적이라 함은 같은 포맷의 여러 데이터 세트를 병합하는 것을 뜻합니다. 예를 들어 현장의 센서 데이터를 분석하려고 할 때 하루 데이터 셋을 병합하여 1주일 데이터 셋으로 만들려고 할 겁니다. 10개의 센서 데이터 열은 변경이 없고 시간에 따른 데이터 변동 값만 존재할 겁니다. 이럴 경우 concat을 사용하여 병합하면 쉽고 빠르게 데이터를 통합할 수 있습니다. concat에 대한 사용법은 작성되는 대로 아래에 링크를 달아 놓겠습니다.
댓글