파이썬 판다스 데이터프레임 합치기, pd.concat(), 열 합치기, 행 합치기, python pandas library cheet sheet

 

 

데이터 프레임을 생성했는데 행으로 합치는 법과 열로 합치는 법을 살펴보겠습니다.

우선 데이터프레임을 하나 만들어보죠.

column = ['이름', '나이', '사는곳']

# df1 데이터프레임 생성
df1 = pd.DataFrame([
    ['김길동', 18, '서울'],
    ['안홍조', 28, '경기'],
    ['강국지', 30, '부산']
], columns=column)

# df2 데이터프레임 생성
df2 = pd.DataFrame([
    ['홍연', 21, '강원'],
    ['이박사', 44, '경기'],
    ['공석사', 34, '충북']
], columns=column)

df1, df2

이 데이터프레임들을 하나의 데이터프레임으로 합쳐보겠습니다.

위아래로 붙여야 말이 되겠죠? 양옆으로 붙이면 이상한 데이터프레임이 되겠죠?

df3 = pd.concat([df1, df2])
df3.head()

 

concat 결과

그러나 무언가 이상합니다. 발견했나요?

행 인덱스가 중복되지요.

이렇게 되면 나중에 참조할때 상당한 문제가 생깁니다. 

2가지 방법이 있습니다. 

가장 간단한 방법은 pd.concat()의 파라미터로 ignore_index = True를 설정해주는 겁니다.

df3 = pd.concat([df1, df2], ignore_index=True)
df3.head()

 

다른 방법으로는 인덱스를 리셋해줘야 합니다.

df3.reset_index()

reset_index()의 특성상 기존의 인덱스는 feature로 생성되고 새로운 인덱스가 sort되서 할당이 됩니다.

그러나 이대로 두면 기존 데이터프레임에 적용되지 않습니다.

inplace = True 파라미터를 반환하거나, 새롭게 df3에 할당시켜줘야 합니다.

df3 = df3.reset_index()
# df3 = df3.reset_index().copy() 를 권장합니다.
# 혹은 df3.reset_index(inplace=True)

# df3.drop('index', axis=1, inplace=True)

# 인덱스를 또 드랍하는것이 번거로우니, 
df3.reset_index(drop=True)
#를 추천드립니다.

df3의 최종 결과물

간단한 방법과, 조금 복잡한 방법으로 나눠서 인덱스 설정을 살펴봤습니다.

결국 우리가 원하던대로 기존의 열에 새로운 행 데이터셋을 합치는 결과물이 완성되었습니다.

 

자 그러면, 반대의 경우도 생각해봐야겠죠? 동일한 열에서의 추가를 봤으니 그 다음은?

고정된 행에서, 오른쪽으로 붙여나가는 열의 데이터(피처 데이터)를 추가하는 겁니다.

기존의 데이터셋 df1을 다시 생성해보죠.

df1 = pd.DataFrame([
    ['김길동', 18, '서울'],
    ['안홍조', 28, '경기'],
    ['강국지', 30, '부산']
])

자 이제 3명의 가상인물의 추가적인 정보를 만든 데이터프레임과 합쳐보겠습니다.

이는 df2로 생성합니다.

df2_column = ['직업', '종교', '특이사항']
df2 = pd.DataFrame([
    ['의적', '불교', '홍길동아님'],
    ['피부과의사', '천주교', '얼굴홍조없음'],
    ['요리사', '기독교', '']
], columns=df2_column)

df2

자 이제 df1과 df2를 합쳐보겠습니다. axis=0(행)이 아닌, axis=1(열)끼리 붙여야겠죠?

df3 = pd.concat([df1, df2], axis=1)

df3

오늘의 코드는 여기까지입니다.

 

위의 개인정보는 임의로 정한 가상의 인물이며 특정인을 지칭하지 않는다는 점 알립니다.

감사합니다.

 파이썬 판다스 melt() 사용법, pd.melt()

네이버 어학사전

사전 정의에 따르면 녹다, 누그러뜨리다 라는 의미를 갖는 이 메소드

과연 무엇인지 살펴봅시다.

 

그림으로 봐서는 대충 무슨 의미인지 알겠습니다. 그러나 헷갈린건 안비밀

사실 처음봤을때는 녹는다기보다 오히려 굳은 느낌인데? 라는 생각이 들었지만,

컬럼을 녹여서 행으로 보낸다 라는 뉘앙스로 이해하면 될 것 같습니다.

 

코드로 바로 가봅시다

판다스 라이브러리를 호출하고 데이터 프레임을 만듭니다.

import pandas as pd

df = pd.DataFrame({'A' : ['a1', 'a2', 'a3', 'a4'],
'B' : ['b1', 'b2', 'b3', 'b4'],
'C' : [1, 2, 3, 4],
'D' : [100, 200, 300, 400]})

output

위의 그림에서와 같이 A를 기준으로 B를 행으로 녹여보려 합니다. (가장 단순한 melt)

df.melt(id_vars='A', value_vars='B')

왜 메소드가 melt인지 이제야 알 것 같습니다.

컬럼에 있던 B가 행으로 주루루루룩 녹아서 해당 값이 인덱스별로 추출하기에 뭔가 용이하도록 전처리가 가능해졌습니다.

여기서 결국 중요한 메소드는 id_vars, value_vars 입니다.

id_vars는 기준이 되는 컬럼을 지정하는 것이고,

value_vars는 녹여서 값과 같이 행으로 들어갈 컬럼을 의미합니다.

 

그러면 melt한 상태의 컬럼명을 바꾸고자 한다면 컬럼인덱스를 다시 설정해줘야 하는 것일까요?

melt() 파라미터에 컬럼명을 바꾸는 기능이 있습니다.

위에서 df.melt()의 결과 프레임을 보시면 컬럼에 variable과 value가 생긴 것을 보실 수 있을겁니다.

해당 컬럼명은 var_name, value_name 인자를 반환하여 바꿀 수 있습니다.

df.melt(id_vars='A', value_vars='B',
       var_name='이곳', value_name='저곳')

감이 오시나요?

 

 

 

 

추가적으로 파라미터를 리스트 형태로 반환할 수 있다는 점!

id_vars, value_vars의 경우 리스트로 반환할 수 있습니다.

 

 

 

 

 

계속 보다보니 id_vars가 반복되는 경우가 생기는군요.

id_vars, value_vars가 2개씩이라면 어떻게 반복될까요?

생각해보세요!!

 

 

요약하자면

id_vars는 변하지 않는 컬럼이다. (기준 컬럼)

다만, value_vars가 리스트 형태처럼 2개 이상으로 필요로 할때는

id_vars는 반복될 수 있다.  (melt되는 컬럼들 숫자가 늘어날수록 기준점은 그만큼 반복을 할당해줘야 되는 것) 

value_vars의 리스트 인자만큼 id_vars들이 반복된다.

 

value_vars는 결국 녹여지는 주인공 컬럼이다.

이 컬럼은 행으로 녹아져 내려오고 그 옆에 해당 컬럼에 있던 값들이 매칭되서 적혀진다.

녹여진 컬럼과 그 컬럼의 값들은 variable, value로 새롭게 나타난다.

 

또한 이 새로운 컬럼들의 이름도 melt()자체에서 바꿀 수 있다.

 

+ Recent posts