Posts Pandas의 유용한 3가지 기능
Post
Cancel

Pandas의 유용한 3가지 기능

출처

1. 들어가면서


  • Pandas는 데이터 분석에 있어 널리 사용되는 라이브러리 입니다. 또한 데이터 분석을 위한 다양한 기능과 방법을 제공합니다.
  • Pandas에서 유용하게 사용할수 있는 기능을 정리합니다.

2. Convert_dtypes


  • 효율적인 데이터 분석을 위해서는 변수에 가장 적합한 데이터 유형을 사용해야 합니다.
  • 또한 연산과 같은 일부 기능을 사용하기 위해서는 특정 데이터 유형이 있어야 합니다.
  • 특정 상황에서는 문자열 데이터 타입이 객체형 데이터 타입보다 더 선호될수도 있습니다.
  • Pandas는 데이터 유형 변환을 처리하는 메서드를 제공합니다.
  • Convert_dtypes는 각 개별적 컬럼을 적합한 데이터 유형으로 변환 해줍니다.
  • 아래의 Sample Data로 확인해보겠습니다.
  • 공식 문서 : https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.convert_dtypes.html
1
2
3
import numpy as np
import pandas as pd
%matplotlib inline
1
2
3
4
5
6
7
8
9
10
11
12
13
14
name = pd.Series(['John', 'Jane', 'Emily', 'Robert', 'Ashley'])
height = pd.Series([1.80, 1.79, 1.76, 1.81, 1.75], dtype='object')
weight = pd.Series([83, 63, 66, 74, 64], dtype='object')
enroll = pd.Series([True, True, False, True, False], dtype='object')
team = pd.Series(['A', 'A', 'B', 'C', 'B'])

df = pd.DataFrame({
    'name':name,
    'height':height,
    'weight':weight,
    'enroll':enroll,
    'team':team
})
df
nameheightweightenrollteam
0John1.883TrueA
1Jane1.7963TrueA
2Emily1.7666FalseB
3Robert1.8174TrueC
4Ashley1.7564FalseB
1
df.dtypes
1
2
3
4
5
6
name      object
height    object
weight    object
enroll    object
team      object
dtype: object
  • 위에서 생성한 데이터프레임의 각 열은 모두 object의 데이터 타입을 가지고 있습니다.
1
2
df_new = df.convert_dtypes()
df_new.dtypes
1
2
3
4
5
6
name       string
height    float64
weight      Int64
enroll    boolean
team       string
dtype: object
  • convert_dtypes의 메소드를 사용하여 각 열을 알맞은 데이터 타입으로 변환시켜주었습니다.
1
df_new
nameheightweightenrollteam
0John1.8083TrueA
1Jane1.7963TrueA
2Emily1.7666FalseB
3Robert1.8174TrueC
4Ashley1.7564FalseB
1
2
df_new = df.convert_dtypes(convert_boolean=False)
df_new
nameheightweightenrollteam
0John1.80831A
1Jane1.79631A
2Emily1.81660B
3Robert1.75741C
4AshleyNaN640B
  • 또한 conver_boolean의 옵션으로 True, False의 Boolean 데이터 타입도 conver_boolean의 옵션을 False로 주게되면 0과 1로 변환을 시켜주어 분석에 더 용이하게 해준다.
  1. Pipe

1
2
3
4
5
6
7
8
9
10
11
12
13
14
name = pd.Series(['John', 'Jane', np.nan, 'Robert', 'Ashley'])
height = pd.Series([1.80, 1.79, 1.76, 1.81, 1.75])
weight = pd.Series([83, 63, 66, 74, 64])
enroll = pd.Series([True, True, False, True, False])
team = pd.Series(['A', 'A', 'B', 'C', 'B'], dtype='string')

df = pd.DataFrame({
    'name':name,
    'height':height,
    'weight':weight,
    'enroll':enroll,
    'team':team
})
df
nameheightweightenrollteam
0John1.8083TrueA
1Jane1.7963TrueA
2NaN1.7666FalseB
3Robert1.8174TrueC
4Ashley1.7564FalseB
    1. height는 미터에서 인치로 변환
    1. Null Data가 있는 행을 삭제
    1. 문자열 타입의 컬럼을 범주형으로 변경
  • 데이터프레임에서 위의 3가지를 변경하겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1. height의 미터를 인치로 변환
def m_to_inch(dataf, column_name):
    # 1m = (1 / 0.0254)
    dataf[column_name] = dataf[column_name] / 0.0254
    return dataf

# 2. Null data는 행 삭제
def drop_missing(dataf):
    dataf.dropna(axis=0, how='any', inplace=True)
    return dataf

# 3. 문자열 타입의 컬럼을 범주형으로 변경
def to_category(dataf):
    cols = dataf.select_dtypes(include='string').columns
    for col in cols:
        ratio = len(dataf[col].value_counts()) / len(dataf)
        if ratio < 0.05:
            dataf[col] = dataf[col].astype('category')
    return dataf
  • 위에서 요구한 3가지 사항에 대해 각각 함수를 작성하였습니다.
  • 다만 문제는 위의 함수를 모두 적용하면 코드가 길어지고, 가독성이 떨어질것 같습니다.
  • 이럴때 Pipe 메소드를 사용하면 편리합니다.
1
2
3
4
5
df_processed = (df.
                pipe(m_to_inch, 'height').
                pipe(drop_missing).
                pipe(to_category))  
df_processed
nameheightweightenrollteam
0John70.86614283TrueA
1Jane70.47244163TrueA
3Robert71.25984374TrueC
4Ashley68.89763864FalseB
1
df_processed.dtypes
1
2
3
4
5
6
name       object
height    float64
weight      int64
enroll       bool
team       string
dtype: object
  • 개별의 함수가 pipe 메소드를 통해서 변경되었습니다.
  • 또한 pipe 메소드를 사용하여 코드도 간결하고 가독성이 좋습니다.
1
df
nameheightweightenrollteam
0John70.86614283TrueA
1Jane70.47244163TrueA
3Robert71.25984374TrueC
4Ashley68.89763864FalseB
  • 주의 : pipe 메소드는 기존의 데이터프레임을 수정합니다. 가능하면 기존의 데이터 프레임의 변경이 없어야 하기 때문에. 원본 데이터 프레임을 다른 사본으로 copy하고 진행하는것이 좋습니다.
  • 위의 df라는 데이터프레임을 보면 수정하지 않았지만, pipe가 적용된 모습입니다.

4. Plot


1
2
marketing = pd.read_csv('./datas/DirectMarketing.csv')
marketing.head()
AgeGenderOwnHomeMarriedLocationSalaryChildrenHistoryCatalogsAmountSpent
0OldFemaleOwnSingleFar475000High6755
1MiddleMaleRentSingleClose636000High61318
2YoungFemaleRentSingleClose135000Low18296
3MiddleMaleOwnMarriedClose856001High182436
4MiddleFemaleOwnSingleClose684000High121304
1
2
marketing.AmountSpent.plot(kind='hist', title='Amount Spent', figsize=(8,5))
plt.show()

  • Amount Spent 컬럼을 plot 메소드를 사용하여 쉽게 확인 가능합니다.
1
2
marketing.plot(x='Salary', y='AmountSpent', kind='scatter', title='Salary VS Amount Spent', figsize=(8,5))
plt.show()

  • Salary와 Amount Spent의 관계를 Scatter plot을 사용하여 그려보았습니다.
  • 위의 예제 말고도 많은 그래프를 plot 함수를 통해 그릴수 있습니다.
  • 이는 다른 시각화 라이브러리를 사용하지않아도 간단한 그래프는 쉽게 그릴수 있습니다.

5. 결론 및 회고


  • Pandas의 유용한 3가지 기능을 알아보았습니다.
  • Pandas는 데이터분석에 있어 속도도 빠르고, 직관적이며 사용하기 쉬워서 굉장히 많은 사랑을 받는 라이브러리입니다.
  • 저도 데이터 분석을 할때 import pandas as pd를 가장 맨위에 적을 정도로 굉장히 많이 쓰고 있습니다.
  • Pandas의 더 많은 기능은 아래의 공식 문서를 확인하면 좋을듯 합니다.
  • 공식 문서 : https://pandas.pydata.org/pandas-docs/stable/index.html
1
This post is licensed under CC BY 4.0 by the author.