HOWTO · Pandas

Pandas Python에서 두 개의 DataFrame을 연결하는 방법

Pandas를 이용하면 인덱스에 대한 다양한 유형의 집합 논리와 join 및 merge 유형 연산을 위한 관계 대수 기능을 사용해 Series 또는 DataFrame을 빠르게 결합할 수 있습니다.

이 페이지의 내용

두 개의 Pandas DataFrame 객체를 pd.concat([df1, df2])로 결합합니다. 기본적으로 이는 행을 쌓고 원래 인덱스 레이블을 유지합니다. 열을 나란히 배치하려면 axis=1을 사용하며, 이때 Pandas는 인덱스 기준으로 행을 정렬합니다. 행이 id와 같은 공유 열을 기준으로 일치해야 한다면, 해당 열을 키로 사용해 DataFrame.merge()를 사용하십시오.

아래 예제는 작고 명시적인 입력을 사용하므로 이 연산을 자신의 열과 인덱스에 맞게 조정할 수 있습니다. 각 출력은 해당 예제의 결과를 보여줍니다.

Pandas Python에서 두 개의 DataFrame 연결

Pandas DataFrame은 다양한 종류의 값을 담을 수 있는 열을 가진 레이블이 지정된 테이블입니다. 두 테이블에 같은 종류의 레코드가 들어 있을 때, 행 방향 연결은 이들을 결합하는 직접적인 방법입니다. 프레임을 원하는 순서대로 리스트로 pd.concat()에 전달하십시오:

import pandas as pd

df1 = pd.DataFrame({"id": [1, 2], "name": ["Ada", "Lin"]})
df2 = pd.DataFrame({"id": [3, 4], "name": ["Sam", "Mina"]})

combined = pd.concat([df1, df2])
print(combined)
   id  name
0   1   Ada
1   2   Lin
0   3   Sam
1   4  Mina

기본값은 axis=0이므로 df2의 행이 df1의 행 뒤에 이어집니다. 원래 인덱스 레이블이 유지되며, 두 입력 모두 인덱스 0에서 시작하므로 결합된 결과에는 인덱스 레이블이 반복됩니다. 새로운 순차 인덱스가 더 유용하다면 ignore_index=True를 전달하십시오: pd.concat([df1, df2], ignore_index=True). 이는 값과 행 순서는 그대로 두고 결과의 인덱스를 변경합니다.

concat()을 사용해 행 또는 열 방향으로 DataFrame 연결

인자 axis는 연결 방향을 선택합니다. axis=0은 행을 추가하며 기본값입니다. axis=1은 열을 추가하고 각 입력을 인덱스 레이블 기준으로 정렬합니다. 예를 들어, 같은 인덱스를 가진 행은 함께 나타나며, 일치하는 레이블이 없는 행도 다른 프레임의 열에 결측값이 들어간 형태로 표시됩니다.

import pandas as pd

names = pd.DataFrame({"name": ["Ada", "Lin"]}, index=[10, 20])
scores = pd.DataFrame({"score": [91, 84]}, index=[10, 20])

side_by_side = pd.concat([names, scores], axis=1)
print(side_by_side)
   name  score
10  Ada     91
20  Lin     84

필요한 결과의 모양에 따라 축을 선택하십시오. 레코드를 쌓을 때는 행을, 필드를 추가할 때는 열을 사용합니다. concat()의 인자 join은 다른 축의 레이블을 어떻게 정렬할지를 설명합니다. 이는 id와 같은 열의 값을 비교하지 않습니다. 그 작업을 위해서는 다음 섹션의 키 기반 병합을 사용하십시오.

인덱스로 DataFrame 정렬하기 또는 공유 키로 조인하기

나란히 연결하는 방식은 데이터 열의 같은 값이 아니라 인덱스 레이블을 일치시킵니다. join="outer"는 다른 축에 대한 기본 정렬이며, 어느 입력에서든 발견되는 레이블을 유지하고 일치하지 않는 셀을 결측값으로 채웁니다. join="inner"는 두 입력 모두에 있는 레이블만 유지합니다. 내부 정렬은 행을 버릴 수 있으므로, 결과를 공유 레이블로 제한하려는 의도가 있을 때만 선택하십시오.

import pandas as pd

left = pd.DataFrame({"name": ["Ada", "Lin"]}, index=[1, 2])
right = pd.DataFrame({"score": [91, 84]}, index=[2, 3])

outer = pd.concat([left, right], axis=1, join="outer")
inner = pd.concat([left, right], axis=1, join="inner")
print("outer rows:", len(outer), "inner rows:", len(inner))
outer rows: 3 inner rows: 1

공유 필드를 사용해 레코드를 일치시키려면 merge()를 사용하고 on으로 키를 지정하십시오. 이 연산은 두 테이블이 서로 다른 행 인덱스를 사용하더라도 같은 키 값을 일치시킵니다. 아래 예제는 두 입력 모두에 있는 ID만 유지합니다. 다른 키 집합이 필요하면 how="left", "right" 또는 "outer"를 사용하십시오.

import pandas as pd

people = pd.DataFrame({"id": [1, 2], "name": ["Ada", "Lin"]})
results = pd.DataFrame({"id": [2, 3], "score": [84, 91]})

matched = people.merge(results, on="id", how="inner")
print(matched)
   id name  score
0   2  Lin     84

사용 중단된 append()를 concat()로 교체

이전 예제에서는 한 프레임의 행을 다른 프레임에 추가하기 위해 append() 메서드를 사용할 수 있습니다. 이 작업에서는 연산을 concat()으로 작성하고 두 프레임을 순서대로 전달하십시오. 이렇게 하면 행 방향 결합이 명시적이 되며 메인 예제와 같은 패턴을 따릅니다:

import pandas as pd

first = pd.DataFrame({"item": ["pen", "book"]})
second = pd.DataFrame({"item": ["lamp"]})

combined = pd.concat([first, second], ignore_index=True)
print(combined)
   item
0   pen
1  book
2  lamp

옵션 ignore_index=True는 소스 인덱스 레이블이 결합된 테이블에서 의미가 없을 때 유용합니다. 해당 레이블에 보존해야 할 정보가 들어 있다면 이를 생략하십시오. 버전별 실행 증거를 이용할 수 없으므로, 이 섹션에서는 어떤 Pandas 버전이 append()를 제공하는지에 대해 주장하지 않습니다.