데이터사이언스

Pandas - 데이터프레임 생성/병합/추출하기

ghtis1798 2021. 1. 8. 00:06

 

Pandas

파이썬은 원래 데이터 분석에 특화된 언어가 아닙니다.

R로 분석하던 것을 파이썬으로 하고 싶은 개발자들이 만든 도구가 NumpyPandas입니다.

데이터분석을 위한 파이썬의 기본 자료구조 딕셔너리, 리스트만으로는 부족했기 때문에,

Pandas에는 데이터프레임, 시리즈라는 자료구조가 추가되었습니다.

 

1. 데이터 프레임 생성

데이터 프레임을 만드는 방법은 여러 가지가 있습니다.

일반적으로 배열, 리스트, 딕셔너리로 만들 수 있습니다.

 

1.1. 배열로 생성하기

첫 번째는 배열(array)을 이용해서 만드는 방법입니다.

우선 배열 자료구조를 사용하기 위해 numpy를 불러오고, pandas도 import 합니다.

import pandas as pd
import numpy as np
sample_array = np.arange(1,6)
sample_array

 

array 생성 결과

생성된 배열로 데이터 프레임을 만들겠습니다.

sample_df = pd.DataFrame({
    'col1' : sample_array,
    'col2' : sample_array*2,
    'col3' : ["A","B","C","D","E"]
})

print(sample_df)

배열로 생성한 DataFrame

1.2. 리스트로 생성하기

 

데이터프레임은 리스트로도 만들 수 있습니다.

df = pd.DataFrame([[80,90,100,70],[70,80,90,100]],
                  index=['달리기','점프'],
                 columns=['모모','츄츄','디디','루루'])
df

리스트로 생성한 DataFrame

 

1.3. 딕셔너리로 생성하기

 

이번엔 딕셔너리로 만들어 보겠습니다.

딕셔너리는 key와 그에 대응하는 value로 이루어진 자료구조입니다.

data = {'score1' : [91,94,97,100], 'score2' : [100, 97, 94, 91]}
data

딕셔너리 생성

data = pd.DataFrame(data, index=['a','b','c','d'])
data

딕셔너리로 생성한 데이터프레임

 

2. 데이터프레임 병합

 

데이터 프레임을 합치는 방법은 4가지가 있습니다.

    1. pd.concat()

    2. df.append()

    3. pd.merge()

    4. df.join()

먼저 pd.concat 함수에 대해 먼저 알아보겠습니다.

 

2.1. pd.concat()

 

데이터 프레임을 두 개 생성하고, concat함수를 사용해 세로로 붙여보겠습니다.

df_1 = pd.DataFrame({
    '모모' : np.array([90,80,70]),
    '츄츄' : np.array([70,80,90])
},index=['먹기','달리기','점프'])

df_2 = pd.DataFrame({
    '모모' : np.array([90,100,60]),
    '츄츄' : np.array([80,90,95])
}, index=['그루밍','깨물기','냥냥펀치'])

 

df_1 생성
df_2 생성

# concat을 사용해 세로로 병합
pd.concat([df_1,df_2])

pd.concat() 결과

 

다음은 가로로 합쳐보겠습니다. 가로로 concatenate할 때는 주의해야합니다.

행과 열중에 보통 행연산에 대해서는 관대한 편이지만, 열에 관해서는 조심할 필요가 있습니다.

예를 들어 탑승객 데이터가 있다고 할 때, 행 1줄이 변경되는 것은 1명의 정보에 영향을 미칩니다.

하지만 열 하나가 삭제되거나 잘못 변경될 경우 모든 탑승객의 정보에 대해 영향을 미치기 때문입니다.

concat함수의 default 옵션세로(axis=0)로 되어있는 이유이기도 합니다.

그럼 이번엔 옵션을 추가해서 세로가 아닌 가로로 붙여보도록 하겠습니다.

pd.concat([result, df_result], axis=1)

pd.concat() axis=1 결과

 

 

이렇게 해줄수도 있지만, 소개한 두 번째 방법인 append함수를 이용해서 병합할 수도 있습니다.

 

2.2. df.append()

 

df_1.append(df_2)

df_1.append(df_2) 결과

 

2.3. pd.merge()

 

merge함수의 경우 Concat과 달리, 중복된 행은 자동으로 처리합니다.

반면 concat의 경우 병합시 그대로 합쳐진다는 점이 차이가 있습니다.

df_11 = pd.DataFrame({
    'col1' : np.array([90,80,70]),
    'col2' : np.array([70,80,90])
})

df_22 = pd.DataFrame({
    'col1' : np.array([90,100,60]),
    'col2' : np.array([70,90,95])
})

df_11 생성
df_22 생성

pd.concat([df_11, df_22])

concat 사용 시 index 중복

pd.merge(df_11, df_22, how="outer")

merge 사용 시 중복 제외

이번엔 on 파라미터를 사용해 Key를 기준으로 Merge 해보도록 하겠습니다.

# 데이터 프레임 생성

left = pd.DataFrame({
    'Key': ['키1','키2','키3','키4'],
    'A': ['A0','A1','A2','A3'],
    'B': ['B0','B1','B2','B3']
})

right = pd.DataFrame({
    'Key': ['키1','키2','키3','키4'],
    'C': ['C0','C1','C2','C3'],
    'D': ['D0','D1','D2','D3']
})

left 생성
right 생성

# Key를 중심으로 left, right 데이터프레임 병합
result = pd.merge(left, right, on='Key')
result

Merge 결과 - Key 중심 병합

 

2.4. df.join()

 

Joint 방식에 대해서는 파라미터로 how를 사용해보도록 하겠습니다.

how에 left를 주느냐, right를 주느냐에 따라 병합 결과가 달라집니다.

왼쪽 프레임과 오른쪽 프레임 중 어디를 기준으로 하느냐의 차이입니다.

예시를 보겠습니다.

 

left = pd.DataFrame({
    'A':['A0','A1','A2'],
    'B':['B0','B1','B2']
}, index=['K0','K1','K2'])

right = pd.DataFrame({
    'C':['C0','C2','C3'],
    'D':['D0','D2','D3']
}, index=['K0','K2','K3'])

left 생성
right 생성

# 왼쪽(left) 데이터 프레임 기준으로 병합
result = left.join(right, how='left')
result

left 조인 결과

# 오른쪽(right) 데이터 프레임 기준으로 병합
result = left.join(right, how='right')
result

right 조인 결과

 

3. 데이터프레임 열 추출하기

 

이번엔 예시로 된 샘플 데이터 프레임을 생성한 뒤, 열에 해당하는 값들을 추출해 보겠습니다.

sample_df = pd.DataFrame({
    'col1' : np.array([1,2,3,4,5]),
    'col2' : np.array([2,4,6,8,10]),
    'col3' : np.array(["A","B","C","D","E"])
})

샘플 DataFrame 생성

열 이름을 지정해서 호출하려면 DataFrame.col_name 형식으로 점(.)을 사용합니다.

sample_df.col2

col2 컬럼 호출 - 점(.)

대괄호를 이용해서도 호출할 수 있습니다.

sample_df["col2"]

col2 컬럼 호출 - 대괄호

여러 개의 컬럼을 호출하고 싶을 땐 대괄호를 한 번 더 사용합니다.

sample_df[["col1","col2"]]

복수 개의 컬럼호출

 

4. loc함수와 iloc함수 사용하기

 

이번엔 loc과 iloc함수를 이용해 데이터를 더 디테일한 방법으로 추출해보겠습니다.

예시로 데이터 프레임을 하나 만들겠습니다.

df = pd.DataFrame(
    [[90,80,70, 40, 90, 50], [70,80,100, 90, 40, 70], [50, 100, 80, 30, 60, 100]],
    index=['모모', '츄츄', '티티']
    ,columns=['먹기','달리기','점프','그루밍','깨물기','냥냥펀치'])
df

샘플 DataFrame

 

4.1. loc함수

 

위에서 생성한 샘플 데이터 프레임입니다.

샘플 데이터 프레임

우선 인덱스를 하나만 줄 경우, 해당 인덱스에 대한 행을 가져옵니다.

df.loc['모모']

loc 결과 - 인덱스 1개

이번엔 리스트 형태로 인덱스를 2개 줘 보도록 하겠습니다.

df.loc[['모모', '츄츄']]

loc 결과 - 인덱스 2개

또한, loc 안에 조건식을 넣을 수도 있습니다.

해당 조건을 만족하는 데이터만 뽑아낼 수 있는 것이죠. 🙂

# 그루밍 능력이 50이 넘는 고양이만 추출
df.loc[df['그루밍']> 50]

loc 안에 조건문 사용 결과

# 그루밍 능력이 50보다 작은 고양이만 추출
df.loc[df['그루밍']<50]

loc 안에 조건문 사용 결과 2

위에서는 그루밍 능력이 50 이상인 행의 모든 컬럼값을 추출했지만

특정 Column값만 추출하는 것도 가능합니다.

# 그루밍 능력이 50보다 작은 고양이들의 '냥냥펀치' Column만 추출
df.loc[df['그루밍']< 50, '냥냥펀치']

loc 조건문 + Column명 사용 결과

 

4.2. iloc 함수

 

마지막으로 iloc 함수입니다.

loc과 iloc의 가장 큰 차이는 label 기반 인덱싱이냐, integer 기반 인덱싱이냐입니다.

쉽게 말해 iloc 함수는 숫자를 기반으로 인덱싱을 합니다.

iloc의 i도 integer-location의 줄임말입니다.

예를 들기 위해 위의 데이터프레임을 다시 사용하겠습니다.

df = pd.DataFrame(
    [[90,80,70, 40, 90, 50], [70,80,100, 90, 40, 70], [50, 100, 80, 30, 60, 100]],
    index=['모모', '츄츄', '티티']
    ,columns=['먹기','달리기','점프','그루밍','깨물기','냥냥펀치'])
df

샘플 데이터 프레임 df

iloc 함수를 이용해서 우선 열만 추출해 보겠습니다.

# 0번째 column은 '먹기'입니다.
df.iloc[:,0]

iloc 컬럼 추출

여러 개 가져오는 것도 가능합니다.

# 0번째, 1번째 column은 먹기, 달리기 입니다.
df.iloc[:,[0,1]]

iloc 컬럼 추출 2

loc과 동일하게 콜론(:)을 이용해서도 인덱싱이 가능합니다.

# 1번째, 2번째, 3번째 컬럼 추출 : 달리기, 점프, 그루밍
df.iloc[:,1:4]

iloc 컬럼 추출 3

같은 방식으로 행에 대해서도 추출할 수 있는데요.

똑같은 방식으로 진행해 보겠습니다. 우선 행 1개만 추출합니다.

# 0번째 행은 '모모'입니다.
df.iloc[0]

iloc 행 추출 1

행 2개를 추출해 보겠습니다.

# 0번째, 1번째 행은 '모모', '츄츄'입니다.
df.iloc[[0,1],:]

iloc 행 추출 2

같은 방식으로 콜론(:)을 사용해서 인덱싱 해 보겠습니다.

# 1번째, 2번째 행은 '츄츄', '티티'입니다.
df.iloc[1:3, :]

iloc 행 추출 3

 

이상으로 Pandas로 데이터프레임을 생성하는 방법과 병합하는 방법,

그리고 loc, iloc 함수를 이용해 데이터를 추출하는 방법에 대해 알아보았습니다. 🙂