Pandas.concat()
파이썬에서 유용하게 사용되는 라이브러리 pandas. 그 중 두 개의 Data Frame 또는 Series를 병합하는 함수인 concat() 함수에 대해 간단히 작성해보려고 한다.
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 함수를 살펴보는 시간이었다.
'하루에 하나 배우기 > Python' 카테고리의 다른 글
[2020-09-01-Python] plotly를 이용한 Bubble chart, 시계열 데이터까지 (0) | 2020.09.01 |
---|---|
[2020-08-28-Python] if __name__ == "__main__" (0) | 2020.08.28 |