Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Pandas에서 두 개의 DataFrame을 병합하는 방법 – append()와 concat() 완벽 가이드


Pandas에서 한 DataFrame의 행을 다른 DataFrame에 추가하려면 append() 함수를 사용할 수 있습니다. 이 함수는 행뿐만 아니라 열을 추가할 때도 활용할 수 있습니다. 예제를 통해 사용 방법을 자세히 살펴보겠습니다.

⚠️ 중요 참고: append() 메서드는 Pandas 1.4.0부터 지원 중단(deprecated)되었으며, Pandas 2.0부터는 완전히 제거되었습니다. 최신 버전의 Pandas에서는 pd.concat() 함수를 사용해야 합니다. 아래에서 두 가지 방법을 모두 소개합니다.

처리 단계

  • 2차원이면서 크기 변경이 가능하고 서로 다른 데이터 타입을 담을 수 있는 표 형태의 데이터인 df1을 생성합니다.
  • 입력 DataFrame인 df1을 출력합니다.
  • 동일한 컬럼 이름을 가진 또 다른 DataFrame인 df2를 생성하고 출력합니다.
  • append 메서드(df1.append(df2, ignore_index=True))를 사용하여 df2의 행을 df1에 추가합니다.
  • 결과 DataFrame을 출력합니다.

예제 1: 동일한 컬럼 이름을 가진 DataFrame 병합

import pandas as pd

df1 = pd.DataFrame({"x": [5, 2], "y": [4, 7], "z": [9, 3]})
df2 = pd.DataFrame({"x": [1, 3], "y": [1, 9], "z": [29, 30]})

print("입력 DataFrame 1:\n", df1)
print("입력 DataFrame 2:\n", df2)

# append() 사용 (구버전 Pandas)
df3 = df1.append(df2, ignore_index=True)

print("병합 후 DataFrame:\n", df3)

출력 결과

입력 DataFrame 1:
   x  y  z
0  5  4  9
1  2  7  3

입력 DataFrame 2:
   x  y   z
0  1  1  29
1  3  9  30

병합 후 DataFrame:
   x  y   z
0  5  4   9
1  2  7   3
2  1  1  29
3  3  9  30

ignore_index=True 옵션을 사용하면 기존 인덱스를 무시하고 0부터 시작하는 새로운 인덱스가 자동으로 부여됩니다. 덕분에 병합된 결과가 깔끔하게 연속된 인덱스를 갖게 됩니다.

예제 2: 다른 컬럼 이름을 가진 DataFrame 병합

이번에는 서로 다른 컬럼 이름을 가진 DataFrame을 ignore_index 파라미터 없이(기본값은 False) 병합해 보겠습니다.

import pandas as pd

df1 = pd.DataFrame({"x": [5, 2], "y": [4, 7], "z": [9, 3]})
df2 = pd.DataFrame({"a": [1, 3], "b": [1, 9], "c": [29, 30]})

print("입력 DataFrame 1:\n", df1)
print("입력 DataFrame 2:\n", df2)

df3 = df1.append(df2)

print("병합 후 DataFrame:\n", df3)

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

입력 DataFrame 1:
   x  y  z
0  5  4  9
1  2  7  3

입력 DataFrame 2:
   a  b   c
0  1  1  29
1  3  9  30

병합 후 DataFrame:
     x    y    z    a    b    c
0  5.0  4.0  9.0  NaN  NaN  NaN
1  2.0  7.0  3.0  NaN  NaN  NaN
0  NaN  NaN  NaN  1.0  1.0  29.0
1  NaN  NaN  NaN  3.0  9.0  30.0

컬럼 이름이 일치하지 않으면 각 DataFrame에 존재하지 않는 값은 NaN(Not a Number)으로 채워집니다. 또한 ignore_index=False(기본값)이므로 원래 인덱스가 그대로 유지되어 인덱스 번호가 중복되는 것을 확인할 수 있습니다.

최신 방법: pd.concat() 사용하기

Pandas 2.0 이상 버전에서는 pd.concat() 함수를 사용해야 합니다. 앞선 예제를 concat으로 대체하면 다음과 같습니다.

import pandas as pd

df1 = pd.DataFrame({"x": [5, 2], "y": [4, 7], "z": [9, 3]})
df2 = pd.DataFrame({"x": [1, 3], "y": [1, 9], "z": [29, 30]})

# concat() 사용 (권장 방법)
df3 = pd.concat([df1, df2], ignore_index=True)

print("병합 후 DataFrame:\n", df3)

pd.concat()은 리스트 안에 여러 개의 DataFrame을 넣어 한 번에 병합할 수 있어, 세 개 이상의 데이터를 다룰 때도 유연하게 활용할 수 있다는 장점이 있습니다.