concat이란?
concat은 "concatenate(연결하다)"의 줄임말로, 여러 개의 DataFrame이나 Series를 하나로 결합하는 Pandas의 메서드입니다. 이 메서드는 원본 데이터를 변경하지 않고 새로운 결합된 데이터프레임을 반환하는 특징을 가지고 있습니다.
DataFrame에서 concat은 여러 데이터프레임을 행(axis=0) 또는 열(axis=1) 방향으로 결합할 수 있으며, Series도 마찬가지로 결합이 가능합니다.
이는 데이터 분석 시 여러 데이터셋을 통합하거나 확장할 때 유용하게 사용되며, 특히 기존 데이터의 불변성을 유지하면서 데이터를 결합해야 하는 상황에서 자주 활용됩니다. 원본 데이터프레임을 수정하지 않고 새로운 결과물을 얻을 수 있다는 점이 큰 장점입니다.
concat사용법
기본문법
pd.concat([df1, df2, ...], axis=0, join='outer', ignore_index=False)
Python
복사
1. 기본적인 행 방향 결합
기본적인 행 방향 결합은 concat 함수를 사용하여 여러 데이터프레임을 위아래로 연결하는 방법입니다. 위 예시 코드에서는 두 개의 데이터프레임 df1과 df2를 생성하고 있습니다. df1은 'A'열과 'B'열로 구성되어 있으며, 각각 'A0', 'A1'과 'B0', 'B1' 값을 포함합니다. df2도 동일한 열 구조를 가지고 있으며, 'A2', 'A3'와 'B2', 'B3' 값을 포함합니다.
이 두 데이터프레임을 pd.concat([df1, df2])로 결합하면, 데이터가 수직으로 쌓이면서 4행 2열의 새로운 데이터프레임이 생성됩니다. 이때 기본적으로 각 데이터프레임의 원래 인덱스가 유지되므로, 결과 데이터프레임에서는 0과 1이 두 번씩 나타나게 됩니다.
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1'], 'B': ['B0', 'B1']})
df2 = pd.DataFrame({'A': ['A2', 'A3'], 'B': ['B2', 'B3']})
result = pd.concat([df1, df2])
Python
복사
A B
0 A0 B0
1 A1 B1
0 A2 B2
1 A3 B3
Python
복사
2. 열 방향 결합 (axis=1)
열 방향 결합은 데이터프레임을 좌우로 연결하는 방식입니다. axis=1 매개변수를 사용하여 수행되며, 이는 데이터프레임의 열을 기준으로 결합한다는 것을 의미합니다.
아래 예시에서는 df1과 df2가 서로 다른 열 이름('A', 'B'와 'C', 'D')을 가지고 있으며, concat 함수를 사용하여 이들을 옆으로 연결합니다. 결과적으로 4개의 열을 가진 하나의 데이터프레임이 생성됩니다.
df1 = pd.DataFrame({'A': ['A0', 'A1'], 'B': ['B0', 'B1']})
df2 = pd.DataFrame({'C': ['C0', 'C1'], 'D': ['D0', 'D1']})
result = pd.concat([df1, df2], axis=1)
Python
복사
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
Python
복사
3. 인덱스 재설정 (ignore_index=True)
인덱스 재설정은 concat 함수의 ignore_index 매개변수를 True로 설정하여 수행할 수 있습니다. 이는 원본 데이터프레임들의 인덱스를 무시하고 새로운 연속적인 인덱스를 생성합니다.
이 방법은 특히 여러 데이터프레임을 결합할 때 인덱스가 중복되는 것을 방지하고, 깔끔하게 정리된 새로운 인덱스를 얻고 싶을 때 유용합니다. 아래 예시에서는 두 데이터프레임을 결합하면서 새로운 연속적인 인덱스(0부터 시작)를 생성합니다.
df1 = pd.DataFrame({'A': ['A0', 'A1'], 'B': ['B0', 'B1']})
df2 = pd.DataFrame({'A': ['A2', 'A3'], 'B': ['B2', 'B3']})
result = pd.concat([df1, df2], ignore_index=True)
Python
복사
A B
0 A0 B0
1 A1 B1
2 A2 B2
3 A3 B3
Python
복사
4. 내부 조인 (join='inner')
내부 조인(join='inner')은 두 데이터프레임에서 공통으로 존재하는 열만 유지하면서 데이터를 결합하는 방식입니다. join='inner' 매개변수를 사용하면, 한쪽 데이터프레임에만 존재하는 열은 결과에서 제외됩니다.
아래 예시에서는 df1에는 'A'와 'B' 열이, df2에는 'B'와 'C' 열이 있습니다. 내부 조인을 수행하면 두 데이터프레임에 공통으로 존재하는 'B' 열만 남게 됩니다. 이는 데이터의 일관성을 유지해야 하는 경우나 공통 항목만을 분석하고자 할 때 유용합니다.
df1 = pd.DataFrame({'A': ['A0', 'A1'], 'B': ['B0', 'B1']})
df2 = pd.DataFrame({'B': ['B2', 'B3'], 'C': ['C2', 'C3']})
result = pd.concat([df1, df2], join='inner')
Python
복사
B
0 B0
1 B1
0 B2
1 B3
Python
복사
5. 키를 사용한 결합 (keys 파라미터)
keys 파라미터를 사용한 결합은 여러 데이터프레임을 결합할 때 각 데이터프레임의 출처를 구분할 수 있게 해주는 방법입니다. 각 데이터프레임에 레이블을 할당하여 계층적 인덱스(hierarchical index)를 생성합니다.
이 방법은 여러 소스의 데이터를 결합한 후에도 각 데이터의 출처를 추적해야 할 때 특히 유용합니다. keys 매개변수에 리스트를 전달하여 각 데이터프레임에 대한 식별자를 지정할 수 있습니다.
아래 예시에서는 두 데이터프레임을 'df1'과 'df2'라는 키로 구분하여 결합합니다. 결과적으로 생성되는 데이터프레임은 두 레벨의 인덱스를 가지게 됩니다: 첫 번째 레벨은 데이터프레임의 출처를 나타내는 키이고, 두 번째 레벨은 원래 데이터프레임의 인덱스입니다.
df1 = pd.DataFrame({'A': ['A0', 'A1'], 'B': ['B0', 'B1']})
df2 = pd.DataFrame({'A': ['A2', 'A3'], 'B': ['B2', 'B3']})
result = pd.concat([df1, df2], keys=['df1', 'df2'])
Python
복사
A B
df1 0 A0 B0
1 A1 B1
df2 0 A2 B2
1 A3 B3
Python
복사
주의사항
•
데이터프레임 구조 불일치 문제
◦
예시: df1은 'A', 'B', 'C' 열을 가지고 있고 df2는 'B', 'C', 'D' 열을 가지고 있을 때
◦
join='outer'를 사용하면 모든 열이 포함되고 없는 값은 NaN으로 채워짐
◦
join='inner'를 사용하면 공통 열인 'B'와 'C'만 유지됨
•
메모리 사용량 관리
◦
대용량 데이터(예: 1GB 이상) 결합 시 메모리 부족 현상 발생 가능
◦
해결책: 데이터를 더 작은 청크로 나누어 순차적으로 처리
◦
필요한 열만 선택하여 결합하는 것을 권장
•
인덱스 관리의 중요성
◦
예시: df1과 df2 모두 0부터 시작하는 인덱스를 가질 때 중복 발생
◦
ignore_index=True 사용 시 0부터 순차적으로 새로운 인덱스 생성
◦
keys 파라미터와 함께 사용하여 출처 추적 가능
이러한 매개변수들을 상황에 맞게 적절히 조합하여 사용하면, 다양한 데이터 결합 시나리오에서 효과적으로 작업할 수 있습니다. 예를 들어, 대용량 데이터를 다룰 때는 join='inner'와 필요한 열만 선택하는 방식을 조합하여 메모리 효율성을 높일 수 있습니다.