본문 바로가기
파이썬

Pandas 판다스 데이터프레임 열 추가, 합치기 등 (concat, merge, join) + 삭제된 append

by Tiabet 2023. 10. 22.

교수님이 수업시간에 배포해주신 실습 코드에 다음과 같은 코드가 있었다.

copy_titanic_df.append({'passengerId':1, 'survived':1, 'pclass':1, 'name':1, 'sex':1,
'age':1, 'sibsp':1, 'parch':1, 'ticket':1, 'fare':1, 'cabin':1,
'embarked':1}, ignore_index=True)

그래서 같은 코드를 주피터 노트북에서 돌려봤더니, 다음과 같은 에러메시지가 떴다.

DataFrame에는 append라는 메소드가 없다는 것이다.

 

순간 뇌정지가 왔지만 판다스의 버젼을 확인해보니, 실습 코드가 실행된 코랩에서의 판다스 버젼은

1.5.3, 내가 올해 4월 경에 주피터에 설치한 판다스 버젼은 2.0.3 이었다. 그래서 구글에 찾아봤더니 append라는 메소드는 판다스에서 삭제되었음을 알 수 있었다. 스택오버플로우와 구글링을 통해 1.4.0부터 appned 메소드가 사라질 거라는 경고메시지를 띄웠고, 2.0 부터 완전히 이용 불가능하게 바뀌었다고 한다.

 

append 함수가 pandas 에서 삭제된 이유는 정확히는 모르겠다. 구글에 의하면 "Series. append and DataFrame. append [are] making an analogy to list." 라는 말이 있는데, list에 analogy를 만든다는 게 정확히 무슨 의미인지를 잘 몰랐다. 대략적으로 해석하면 뭔가 비효율적인 작업이라서 삭제했다는 것을 확인했다.

 

그래서 대놓고 concat을 대신 사용하라고 권유하는 중이다. 따라서 이번 포스팅에선 데이터프레임을 합치고, 추가하는 기능을 해주는 함수들에 대해서 간단하게 정리해보고자 한다.

 

 

가장 많이 사용하면 concat 함수

pandas에서도 권유하고 있고, 사람들이 판다스 데이터프레임을 합칠 때 가장 많이 사용하는 함수는 concat이다. 

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

 

pandas.concat — pandas 2.2.0 documentation

If True, do not use the index values along the concatenation axis. The resulting axis will be labeled 0, …, n - 1. This is useful if you are concatenating objects where the concatenation axis does not have meaningful indexing information. Note the index

pandas.pydata.org

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


0    a
1    b
0    c
1    d
dtype: object

 

import pandas as pd

# Creating two sample DataFrames
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})

# Concatenating along the rows (axis=0)
result = pd.concat([df1, df2])

print("DataFrame 1:")
print(df1)
print("\nDataFrame 2:")
print(df2)
print("\nConcatenated Result:")
print(result)

DataFrame 1:
   A  B
0  1  3
1  2  4

DataFrame 2:
   A  B
0  5  7
1  6  8

Concatenated Result:
   A  B
0  1  3
1  2  4
0  5  7
1  6  8

concat은 그 사용법이 간단하다. Series나 Dataframe을 생성한 뒤, 대괄호 [] 로 묶어주기만 하면 끝이다. 파라미터로는 여러 옵션들이 있는데 가장 많이 사용하는 파라미터는 ignore_index 파라미터와 axis 파라미터이다. ignore_index를 True로 설정해주면 (디폴트는 False) index를 알아서 리셋해줘서 0부터 설정할 수 있게 된다. axis를 1로 설정해주면 행이 아닌 열에 대하여 합칠 수 있다. (디폴트는 0) 

>>> pd.concat([s1, s2], ignore_index=True)
0    a
1    b
2    c
3    d
dtype: object

만약 맨 처음처럼 데이터 한 개를 더 추가하고 싶은 경우라면, 추가하고자 하는 데이터를 시리즈 객체로 변환한 뒤 데이터프레임과 concat해주면 될 것이다. 참고로 concat은 concatenate의 약자로, 엑셀 등에서 사용되는 프로그래밍 언어이다. 한글로 직역하면 사슬 같이 잇다 라는데, 구글에 찾아보니 일상 생활에서 사용하지 않는 문어체인 것 같다.

 

merge 함수

merge 함수는 이름에서 알 수 있듯이 두 개의 데이터프레임을 병합하는 함수이다. 다만 concat과는 다르게 데이터베이스 스타일로 병합할 때를 위한 함수이기 때문에, 파라미터가 concat과는 다소 차이가 있다. 

 

df1 = pd.DataFrame({'lkey': ['foo', 'bar', 'baz', 'foo'],
                   'value': [1, 2, 3, 5]})
df2 = pd.DataFrame({'rkey': ['foo', 'bar', 'baz', 'foo'],
                    'value': [5, 6, 7, 8]})
>>> df1
    lkey value
0   foo      1
1   bar      2
2   baz      3
3   foo      5
>>> df2
    rkey value
0   foo      5
1   bar      6
2   baz      7
3   foo      8

df1.merge(df2, left_on='lkey', right_on='rkey')
  lkey  value_x rkey  value_y
0  foo        1  foo        5
1  foo        1  foo        8
2  bar        2  bar        6
3  baz        3  baz        7
4  foo        5  foo        5
5  foo        5  foo        8

 

그런데 내 경험상 이렇게 left_on 과 right_on 파라미터를 사용하기 보단 on 과 how로 병합하는 경우가 더 많다.

 

import pandas as pd

df1 = pd.DataFrame({'ID': [1, 2, 3], 'Name': ['Alice', 'Bob', 'Charlie']})
df2 = pd.DataFrame({'ID': [2, 3, 4], 'Age': [25, 30, 22]})

result = pd.merge(df1, df2, on='ID', how = 'inner')

print("DataFrame 1:")
print(df1)
print("\nDataFrame 2:")
print(df2)
print("\nMerged Result:")
print(result)
DataFrame 1:
   ID     Name
0   1    Alice
1   2      Bob
2   3  Charlie

DataFrame 2:
   ID  Age
0   2   25
1   3   30
2   4   22

Merged Result:
   ID     Name  Age
0   2      Bob   25
1   3  Charlie   30

 

on 파라미터는 합칠 때 어떤 열을 기준으로 합칠 것인지를 설정할 수 있다. how는 합치는 방식을 의미하는데, inner는 on으로 설정한 열에서 교집합만, outer는 합집합을 보여준다. 이 외에도 left, right 등으로 설정할 수 있다. 아래는 how를 outer로 설정했을 때의 결과다.

Merged Result:
   ID     Name   Age
0   1    Alice   NaN
1   2      Bob  25.0
2   3  Charlie  30.0
3   4      NaN  22.0

 

join 함수

join함수는 데이터프레임에 다른 칼럼을 합칠 때 사용하는 함수다. 사실 소개만 이렇게 돼있고, 실제 사용은 merge랑 다소 비슷한 느낌이 든다. merge가 겹치는 칼럼이 있을 때 사용하는 병합 함수라면, join은 겹치는 인덱스가 있을 때 사용하는 병합 함수다.

 

import pandas as pd

# Creating two sample DataFrames
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]}, index=['row1', 'row2'])
df2 = pd.DataFrame({'C': [5, 6], 'D': [7, 8]}, index=['row2', 'row3'])

# Join DataFrames based on their indices
result = df1.join(df2, how='inner')

print("DataFrame 1:")
print(df1)
print("\nDataFrame 2:")
print(df2)
print("\nJoined Result:")
print(result)

 

DataFrame 1:
      A  B
row1  1  3
row2  2  4

DataFrame 2:
      C  D
row2  5  7
row3  6  8

Joined Result:
      A  B  C  D
row2  2  4  5  7

 

how 파라미터는 merge와 동일하게 설정할 수 있다. 

 

그리고 join과 merge 모두 on처럼 합치기로 한 축으로 설정한 열 말고, 겹치는 열이 더 존재할 수가 있다. 이런 경우엔 아래처럼 생성이 된다.

>>> df1.merge(df2, left_on='lkey', right_on='rkey')
  lkey  value_x rkey  value_y
0  foo        1  foo        5
1  foo        1  foo        8
2  bar        2  bar        6
3  baz        3  baz        7
4  foo        5  foo        5
5  foo        5  foo        8

value 뒤에 _x, _y 처럼 자동으로 열 이름이 수정되어서 생성되는 것이다. 이를 후미에 혼다고 해서 suffix라고 부르는데, 이 또한 파라미터로 설정할 수 있다.

>>> df1.merge(df2, left_on='lkey', right_on='rkey',
...           suffixes=('_left', '_right'))
  lkey  value_left rkey  value_right
0  foo           1  foo            5
1  foo           1  foo            8
2  bar           2  bar            6
3  baz           3  baz            7
4  foo           5  foo            5
5  foo           5  foo            8

이런 식으로 열 이름을 원하는 모양으로 설정할 수 있다. 

 

병합 함수는 분명 데이터프레임을 원하는 모양으로 만들고 싶어서 사용할 것이다. 그런데 병합 함수를 사용해도, 원하는 모양대로 나오지 않는 경우가 종종 있다. 생각과 다르게 결과가 나올 땐, merge 나 join 등을 잘 살펴보고 결정해야 한다.