HOWTO · Pandas
두 Pandas 시리즈를 DataFrame으로 병합
이 가이드는 pandas.concat(), pandas.merge(), DataFrame.join() 메서드를 사용하여 두 개의 Pandas 시리즈를 DataFrame으로 결합하거나 병합하는 방법을 보여줍니다.
이 페이지의 내용
pandas에서 Series는 인덱스가 있는 1차원 레이블 배열로, 대략 하나의 데이터 열이라고 생각하면 됩니다. 두 개 이상의 Series를 DataFrame으로 병합하려면 axis=1과 함께 pandas.concat()에 전달하세요. 각 Series는 자신의 이름을 열 제목으로 사용하는 열이 됩니다. 다른 방식이 필요할 때는 pandas.concat()로 Series를 세로로 쌓거나, pandas.merge()로 SQL 조인처럼 인덱스를 기준으로 행을 맞추거나, DataFrame.join()로 기존 DataFrame에 이름이 있는 Series를 추가할 수 있습니다.
이 튜토리얼에서는 실행 가능한 예제를 통해 각 방법을 살펴봅니다.
필요한 결과에 따라 방법 선택하기
네 가지 방법 모두 표 형태의 데이터를 만들지만, 각각 해결하는 문제는 다릅니다.
pandas.concat([s1, s2], axis=1)은 Series를 나란히 배치해 각각을 새DataFrame의 열로 만듭니다.- 기본값
axis=0을 사용하는pandas.concat([s1, s2])는 Series를 하나의 더 긴 Series로 쌓습니다. 결과를pd.DataFrame()으로 감싸면 한 열짜리DataFrame이 됩니다. 이 방법은 pandas 2.0에서 제거된Series.append()의 현재 대체 방법입니다. pandas.merge(left, right, left_index=True, right_index=True)는 SQL 조인처럼 인덱스나 공통 키 값을 기준으로 행을 맞춥니다.df.join(series)는 이미 있는DataFrame에 이름이 있는 Series를 추가하고 인덱스를 기준으로 정렬합니다.
이 방법들을 관통하는 한 가지 동작은 pandas가 레이블이 있는 데이터를 인덱스로 정렬한다는 점입니다. 입력 Series가 같은 인덱스를 공유하면 정렬 과정이 눈에 잘 띄지 않습니다. 인덱스가 다르면 한 입력에만 있는 레이블은 결합 결과에서 결측값(NaN)을 만듭니다.
pandas.concat()로 Series를 열로 결합하기
pandas.concat() 함수는 축을 따라 pandas 객체를 연결합니다. axis=1을 전달하면 객체를 열로 나란히 배치하고, 각 Series 이름은 열 제목이 되며 행은 인덱스를 기준으로 정렬됩니다.
다음 예제를 실행해 보세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import pandas as pd
# Create Series by assigning names
products = pd.Series(
["Intel Dell Laptops", "HP Laptops", "Lenavo Laptops", "Acer Laptops"],
name="Products",
)
dollar_price = pd.Series([350, 300, 400, 250], name="Price")
percentage_sale = pd.Series([83, 99, 84, 76], name="Sale")
# merge three pandas series as columns using pandas.concat()
df = pd.concat([products, dollar_price, percentage_sale], axis=1)
print(df)
출력:
Products Price Sale
0 Intel Dell Laptops 350 83
1 HP Laptops 300 99
2 Lenavo Laptops 400 84
3 Acer Laptops 250 76
세 Series가 기본 정수 인덱스를 공유하므로 행이 순서대로 맞춰집니다. 기본값인 axis=0으로 같은 호출을 실행하면 열을 만드는 대신 값들이 하나의 긴 Series로 쌓입니다.
pandas.concat()로 Series를 세로로 쌓기
이 작업의 이전 버전에서는 axis=0을 따라 연결하는 바로 가기인 Series.append()를 사용했습니다. 이 메서드는 pandas 1.4에서 사용 중단되었고 pandas 2.0에서 제거되었으므로 지금 호출하면 AttributeError가 발생합니다. 대체 방법은 pandas.concat()입니다. Series를 목록으로 전달하고 ignore_index=True를 설정해 결합된 결과의 번호를 다시 매기세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import pandas as pd
technical = pd.Series(["Pandas", "Python", "Scala", "Hadoop"])
non_technical = pd.Series(["SEO", "Graphic design", "Content writing", "Marketing"])
# stack the series and shape the result into a one-column DataFrame
df = pd.DataFrame(
pd.concat([technical, non_technical], ignore_index=True), columns=["Skills"]
)
print(df)
출력:
Skills
0 Pandas
1 Python
2 Scala
3 Hadoop
4 SEO
5 Graphic design
6 Content writing
7 Marketing
여기서 pd.concat()은 여덟 개의 값을 가진 단일 Series를 반환하고, pd.DataFrame(..., columns=["Skills"])가 이를 한 열짜리 DataFrame으로 만듭니다. 번호를 다시 매기는 대신 원래 인덱스 레이블을 유지하려면 ignore_index=True를 제거하세요.
pandas.merge()로 인덱스 기준 Series 맞추기
pandas.merge()는 이름이 있는 Series나 DataFrame 객체 사이에서 SQL 스타일 조인을 수행합니다. 병합된 값은 열이 되므로 각 Series에는 name이 필요합니다. left_index=True와 right_index=True를 설정하면 pandas.merge()가 키 열이 아니라 인덱스를 기준으로 행을 맞춥니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import pandas as pd
# Create Series by assigning names
products = pd.Series(
["Intel Dell Laptops", "HP Laptops", "Lenavo Laptops", "Acer Laptops"],
name="Products",
)
dollar_price = pd.Series([350, 300, 400, 250], name="Price")
# match the two series on their index labels
df = pd.merge(products, dollar_price, right_index=True, left_index=True)
print(df)
출력:
Products Price
0 Intel Dell Laptops 350
1 HP Laptops 300
2 Lenavo Laptops 400
3 Acer Laptops 250
기본 조인은 how="inner"이므로 한 Series에만 있는 인덱스 레이블은 결과에서 제외됩니다. 모든 레이블을 유지하고 빈 곳을 NaN으로 채우려면 how="outer"를 전달하세요. 인덱스가 아니라 값을 기준으로 맞추려면 Series를 DataFrame으로 변환한 뒤 열 이름을 on에 전달하면 됩니다.
DataFrame.join()로 Series를 DataFrame에 조인하기
한쪽이 이미 DataFrame일 때는 DataFrame.join()가 가장 편리한 선택입니다. 첫 번째 Series를 pd.DataFrame()으로 변환한 다음 두 번째 Series로 .join()을 호출하세요. 이 Series에는 name이 있어야 하며, 그 이름이 새 열 제목이 됩니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import pandas as pd
# Create Series by assigning names
products = pd.Series(
["Intel Dell Laptops", "HP Laptops", "Lenavo Laptops", "Acer Laptops"],
name="Products",
)
dollar_price = pd.Series([350, 300, 400, 250], name="Price")
# join the price series to a DataFrame built from products
df = pd.DataFrame(products).join(dollar_price)
print(df)
출력:
Products Price
0 Intel Dell Laptops 350
1 HP Laptops 300
2 Lenavo Laptops 400
3 Acer Laptops 250
pandas.merge()처럼 DataFrame.join()도 인덱스를 기준으로 정렬하지만, 기본적으로 왼쪽 조인을 사용하므로 호출한 DataFrame의 모든 행이 유지됩니다.
방법 선택을 다시 정리하면, 독립적인 Series로 DataFrame을 만들 때는 axis=1과 함께 pandas.concat()를 사용하고, Series.append()가 이전에 수행하던 세로 쌓기 작업에는 axis=0을 따라 pandas.concat()를 사용하세요. 인덱스나 키 값으로 행을 맞춰야 할 때는 pandas.merge()를, 이미 가지고 있는 DataFrame에 이름이 있는 Series를 추가할 때는 DataFrame.join()를 사용하면 됩니다.