본문 바로가기

하루에 하나 배우기/Python

[2020-08-30-Python] Pandas pandas.concat() 함수

 


Pandas.concat()

 

파이썬에서 유용하게 사용되는 라이브러리 pandas. 그 중 두 개의 Data Frame 또는 Series를 병합하는 함수인 concat() 함수에 대해 간단히 작성해보려고 한다.

 

 

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.concat.html

 

 

concat 함수는 여러 parameters를 가지고 있지만, 그 중 자주 이용되는 것은 몇 가지로 추려진다. 공식 홈페이지에 나와있는 예제를 따라해보자.

 

 

예제1

import pandas as pd

s1 = pd.Series(['a', 'b'])
s2 = pd.Series(['c', 'd'])

result = pd.concat([s1, s2])

print(result)

출력 결과

0    a
1    b
0    c
1    d
dtype: object

 

 

첫 예제는 두 Series형 데이터를 수직으로 합치는 예제이다. 그런데, 좌측의 index가 0 1 2 3 이 아닌 0 1 0 1 로 되어있다. 이를 이쁘게 바꾸려면 ignore_index라는 parameter를 True로 바꾸어 주어야 한다.

 

 


예제2

import pandas as pd

s1 = pd.Series(['a', 'b'])
s2 = pd.Series(['c', 'd'])

result = pd.concat([s1, s2], ignore_index=True)

print(result)

출력 결과

0    a
1    b
2    c
3    d
dtype: object

 

이렇게 ignore_index를 조작하여 index를 0 1 2 3 처럼 순서대로 할 수 있다. 기존의 index를 무시하고 새로운 index를 부여한다는 뜻이다.

 

다음으로 두 개의 DataFrame 객체를 병합해보자. 단 각 데이터 프레임은 동일한 column 이름을 가지고 있다. 아래 예제를 보자.

 


 

예제3

import pandas as pd

df1 = pd.DataFrame([['a', 1], ['b', 2]],
                   columns=['letter', 'number'])
print(df1)

df2 = pd.DataFrame([['c', 3], ['d', 4]],
                   columns=['letter', 'number'])
print(df2)

result = pd.concat([df1, df2], ignore_index = True)
print(result)

출력 결과

  letter  number
0      a       1
1      b       2

  letter  number
0      c       3
1      d       4

  letter  number
0      a       1
1      b       2
2      c       3
3      d       4

 

앞서 말했던 것처럼 동일한 columns을 가지고 있는 두 DataFrame 병합시 수직으로 그대로 붙는다. 여기서 또한 ignore_index parameter를 이용하여 index를 조정할 수 있다. 하지만 만약 서로 다른 columns을 가지고 있는 두 DataFrame을 병합하면 어떻게 될까? 예제4를 보자.

 


예제4

import pandas as pd

df1 = pd.DataFrame([['a', 1], ['b', 2]],
                   columns=['letter', 'number'])
print(df1)

df2 = pd.DataFrame([['c', 3], ['d', 4]],
                   columns=['letter', 'not_number'])
print(df2)

result = pd.concat([df1, df2], ignore_index=True)
print(result)


 출력 결과

  letter  number
0      a       1
1      b       2

  letter  not_number
0      c           3
1      d           4

  letter  number  not_number
0      a     1.0         NaN
1      b     2.0         NaN
2      c     NaN         3.0
3      d     NaN         4.0

 

다음과 같이 두 DataFrame이 가지고 있는 columns의 '합집합'이 전체 columns이 되며 서로 가지고 있지 않은 성분은 NaN(비어있음)으로 표시된다. 나쁘지 않은 병합이라고 생각한다.

 


 

다음 예제5에서는 join, sort 이 두 가지 parameter에 대해서 살펴보자. 방금 말했듯이 서로 다른 columns를 가지고 있는 DataFrame들을 병합할 때 '합집합'이 새로운 columns이 된다. 하지만 '교집합'이 새로운 columns이 되기를 원할 때 조절할 수 있는 parameter가 바로 join이고, 각 column들을 이름순으로 정렬할 것인지에 대한 parameter가 sort이다.  

 

 

예제5

import pandas as pd

df1 = pd.DataFrame([['a', 1], ['b', 2]],
                   columns=['letter', 'int'])
print(df1)

df3 = pd.DataFrame([['c', 3, 'cat'], ['d', 4, 'dog']],
                   columns=['letter', 'int', 'animal'])
print(df3)

result = pd.concat([df1, df3], join="inner", sort=True, ignore_index=True)
print(result)

출력 결과

  letter  int
0      a    1
1      b    2

  letter  int animal
0      c    3    cat
1      d    4    dog

   int letter
0    1      a
1    2      b
2    3      c
3    4      d

우리는 출력 결과에서 각 columns의 교집합이 새로운 columns가 된 것을 확인할 수 있고, int와 letter 중 사전식으로 앞에 오는 int가 앞에 위치한 것 또한 볼 수 있다.

 

 


 

마지막으로 중요한 parameter인 axis를 살펴보고 글을 마치려고 한다. axis는 단어 뜻 그대로 어떤 축을 기준으로 데이터를 병합할 것인지를 선택하는 parameter이다. 바로 에제를 확인해보자.

 

 

예제6

import pandas as pd

df1 = pd.DataFrame([['a', 1], ['b', 2]],
                   columns=['letter', 'int'])
print(df1)

df4 = pd.DataFrame([['bird', 'polly'], ['monkey', 'george']],
                   columns=['animal', 'name'])
print(df4)

result = pd.concat([df1, df4], axis=1)
print(result)

출력 결과

  letter  int
0      a    1
1      b    2

   animal    name
0    bird   polly
1  monkey  george

  letter  int  animal    name
0      a    1    bird   polly
1      b    2  monkey  george

 

axis의 기본 값은 0으로, 우리가 처음에 봤던 것처럼 수직으로 데이터를 병합한다. 하지만 이 값을 1로 바꿔준다면 출력 결과에서 볼 수 있듯이 수평으로 데이터를 병합하는 것을 볼 수 있다.

 

간단하게 pandas의 concat 함수를 살펴보는 시간이었다.