본문 바로가기
카테고리 없음

20-10-07, Pandas_2일차(정렬, NaN처리, 유틸리티함수)

by NickNuma 2020. 10. 12.

2일차에서는 1일차에서 했던 행열 검색 및 입력을 잠깐알아보고
index, 행, 열 추가 삭제, 정렬, NaN처리, 유용한 함수들에 대해서 살펴봤습니다.

seaborn install 오류로 시간 날리고 다음에.
python3.9 버전을 쓰고 있었는데. 이거든 pip 버전이든. 둘 중 하나 문제였음.
다운그레이드하고 설치하니까 잘 됐음.


 


정렬

"""
    정렬 방법
    1. df.sort_values('컬럼명') 또는
        df.sort_values(by='컬럼명')

    2. 다중정렬
        df.sort_values(by=['컬럼명', '컬럼명'])

    ##################################
    3. 컬럼명 변경
        df.rename(colums={'기존컬럼명':'새로운컬럼명', '기존컬럼명2':'새로운컬럼명2'})

    4. 특정 컬럼 빈도수
        df['특정컬럼'].value.counts()

    ####################################
    5. df.sort_index    ==> 인덱스로 정렬
        df.sort_index(axis=0)   => 행(row) 정렬
        df.sort_index(axis=1)   => 열(column) 정렬

"""

seaborn의 mpg 데이터셋 로드 (원본)

df = sns.load_dataset('mpg')
print("1. 원본:\n", df)
#      mpg  cylinders  ...  origin                       name
# 0    18.0          8  ...     usa  chevrolet chevelle malibu
# ...
# 397  31.0          4  ...     usa                 chevy s-10

원본 데이터셋의 컬럼

print("2. columns: \n", df.columns)
# Index(['mpg', 'cylinders', 'displacement', 'horsepower', 'weight',
#        'acceleration', 'model_year', 'origin', 'name'],
#       dtype='object')

 


컬럼 기준 오름차순 정렬
.sort_values('컬럼명')   ascending = True <-- default 값 (오름차순 기본)

#1. df.sort_values(컬럼)
sorted_df = df.sort_values('mpg')
print("3. df.sort_values(컬럼), 오름차순정렬(default):\n", sorted_df)
#      mpg  cylinders  displacement  ...  model_year  origin                  name
# 28    9.0          8         304.0  ...          70     usa              hi 1200d
# ...
# 322  46.6          4          86.0  ...          80   japan             mazda glc

컬럼 기준 내림차순 정렬
.sort_values('컬럼명', ascending = False)

sorted_df = df.sort_values(by = 'mpg', ascending=False)
print("4. df.sort_values(컬럼), 내림차순정렬:\n", sorted_df)
#      mpg  cylinders  displacement  ...  model_year  origin                  name
# 322  46.6          4          86.0  ...          80   japan             mazda glc
# ...
# 28    9.0          8         304.0  ...          70     usa              hi 1200d

 


 


다중 정렬
sort_values(by = ['컬럼명', '컬럼명']

#2. 다중 정렬
multi_sorted_df = df.sort_values(by=['mpg', 'displacement'])
print("5. 다중 정렬 -> df.sort_values(by=['컬럼명', '컬럼명']): \n", multi_sorted_df)
#      mpg  cylinders  displacement  ...  model_year  origin                  name
# 28    9.0          8         304.0  ...          70     usa              hi 1200d
# ...
# 322  46.6          4          86.0  ...          80   japan             mazda glc

 


컬럼명 변경
.rename(columns={'old name' : 'new name'}

#3. 컬럼명 번경
new_df = df.rename(columns={'model_year':'year'})
print("6. 컬럼명 변경 : \n", new_df)
#      mpg  cylinders  displacement  ...  year  origin                       name
# 0    18.0          8         307.0  ...    70     usa  chevrolet chevelle malibu
# ...
# 397  31.0          4         119.0  ...    82     usa                 chevy s-10

 


컬럼 빈도수 (*****)
.value_counts()

# 특정컬럼의 빈도수 (*******)
print("7. origin 컬럼의 빈도수: \n", df['origin'].value_counts())
#  usa       249
# japan      79
# europe     70
# Name: origin, dtype: int64

 


원본 데이터셋

df = sns.load_dataset('mpg')
df_10 = df[:10]
print("1. 원본:\n", df_10)
#     mpg  cylinders  displacement  ...  model_year  origin                       name
# 0  18.0          8         307.0  ...          70     usa  chevrolet chevelle malibu
# ...
# 9  15.0          8         390.0  ...          70     usa         amc ambassador dpl

 


인덱스 변경

df_10.index = [100, 60, 10, 50, 20, 90, 70, 40,80, 30]
print("2. 인덱스 변경:\n", df_10)
#      mpg  cylinders  ...  origin                       name
# 100  18.0          8  ...     usa  chevrolet chevelle malibu
# ...
# 30   15.0          8  ...     usa         amc ambassador dpl

인덱스 정렬 (오름차순)
.sort_index()

sorted_df = df_10.sort_index()
print("3. 인덱스 정렬(오름차순, default)\n", sorted_df)
#      mpg  cylinders  ...  origin                       name
# 10   18.0          8  ...     usa         plymouth satellite
# ...
# 100  18.0          8  ...     usa  chevrolet chevelle malibu

 인덱스 정렬 ( 내림차순, axis = 0 (x축 기준) )
.sort_index(axis=0, ascending = False)

sorted_df = df_10.sort_index(axis=0, ascending=False)
print("4. 인덱스 정렬(내림차순)\n", sorted_df)
#      mpg  cylinders  ...  origin                       name
# 100  18.0          8  ...     usa  chevrolet chevelle malibu
# ...
# 10   18.0          8  ...     usa         plymouth satellite

 인덱스 정렬 (axis = 1 (y축 기준) )

column_sorted_df = df_10.sort_index(axis=1)
print("5. 인덱스 정렬(오름차순)\n", column_sorted_df.iloc[:, 3:])
#       acceleration  cylinders  ...  origin  weight
# 100          12.0          8  ...     usa    3504
# 60        165.0          70  15.0          buick skylark 320    usa    3693
# ...
# 80        225.0          70  14.0           pontiac catalina    usa    4425
# 30            8.5          8  ...     usa    3850

 


NaN 처리

"""
   DataFrame 대상으로 NaN 처리 방법
        1. NaN, nan, None 찾기    == Null값 찾기
            -pd.isna(df)
            -df.isnull()
            -pd.isnull(df)
            -df.isnull()

        2. not Null값 찾기
            -pd.notnull(df)
            -df.notnull()
            -~df.isna()         (부정 연산자 : ~)

###################################################
    Series(특정칼럼) 대상으로 NaN 처리 방법
        1. df['컬럼명'].isnull()

###################################################
    행에 하나라도 NaN이 존재하면 행 삭제
        1. df.dropna()  ==> axis = 0
        2. df.dropna(axis = 0 / 1, how = "all")   ==> 행/열의 모든 값이 NaN이면 삭제

####################################################
    지정된 NaN값을 갖는 컬럼의 값을 변경
        1. df.fillna({컬럼명:값, 컬럼명:값, ...})   ==> 지정된 컬럼의 NaN값을 지정된 값으로 변경
        2. df.fillna('변경될 값')  ==> 모든 NaN값을 '변경될 값'으로 변경
        3. bf.bfill     ==> 뒤의 값으로 대체
           bf.ffill     ==> 앞의 값으로 대체
"""

 


원본

df = pd.DataFrame({
    'a':[10, 20, 30, np.nan, 50, np.nan], 'b':[6, 41, 33, 2, np.nan, np.nan], 'c':[np.nan, 2, np.nan, 3, 4, np.nan]},
    index=range(1, 7))
print("1. 원본:\n", df)
#      a     b    c
# 1  10.0   6.0  NaN
# 2  20.0  41.0  2.0
# 3  30.0  33.0  NaN
# 4   NaN   2.0  3.0
# 5  50.0   NaN  4.0
# 6   NaN   NaN  NaN

NaN, None, Null 찾기
pd.isna(df)

print("2. pd.isna(df): \n", pd.isna(df))
#         a      b      c
# 1  False  False   True
# 2  False  False  False
# 3  False  False   True
# 4   True  False  False
# 5  False   True  False
# 6   True   True   True


df.isna()

print("3. df.isna(): \n", df.isna())
#         a      b      c
# 1  False  False   True
# 2  False  False  False
# 3  False  False   True
# 4   True  False  False
# 5  False   True  False
# 6   True   True   True

pd.isnull(df)

print("4. pd.isnull(df): \n", pd.isnull(df))
#         a      b      c
# 1  False  False   True
# 2  False  False  False
# 3  False  False   True
# 4   True  False  False
# 5  False   True  False
# 6   True   True   True

df.isnull()

print("5. df.isnull(): \n", df.isnull())
#         a      b      c
# 1  False  False   True
# 2  False  False  False
# 3  False  False   True
# 4   True  False  False
# 5  False   True  False
# 6   True   True   True

 


컬럼별 NaN 갯수
insnull().sum()

#2. 컬럼별 NaN 갯수
print("6. 컬럼별 NaN 갯수:\n", df.isnull().sum())
# a    2
# b    2
# c    3

NaN 총갯수
insnull().sum().sum()

#3. NaN의 총갯수
print("7. NaN의 총갯수:", df.isnull().sum().sum())   #7

특정 컬럼의 NaN 갯수
df['컬럼명'].isna().sum()

print("12. a 컬럼의 NaN 갯수:", df['a'].isna().sum())  # 2

 


not null 값 찾기
.notnull(df)

print("8. pd.notnull(df):\n", pd.notnull(df))
#         a      b      c
# 1   True   True  False
# 2   True   True   True
# 3   True   True  False
# 4  False   True   True
# 5   True  False   True
# 6  False  False  False

.notnull()

print("9. df.notnull():\n", df.notnull())
    # a      b      c
# 1   True   True  False
# 2   True   True   True
# 3   True   True  False
# 4  False   True   True
# 5   True  False   True
# 6  False  False  False

~df.isna()

print("10. ~df.isna():\n", ~df.isna())
#      a      b      c
# 1   True   True  False
# 2   True   True   True
# 3   True   True  False
# 4  False   True   True
# 5   True  False   True
# 6  False  False  False

 


컬럼별 NaN 처리

#1. Series(컬럼별) NaN 처리
print("11. df['a'].isna():\n", df['a'].isna())
# 1    False
# 2    False
# 3    False
# 4     True
# 5    False
# 6     True
# Name: a, dtype: bool

 


원본

df = pd.DataFrame({
    'a':[10, 20, 30, 40, 50, 60],
    'b':[6, 41, 33, 2, np.nan, np.nan],
    'c':[np.nan, 2, np.nan, 3, 4, np.nan],
    'd':[np.nan, 4, np.nan, np.nan, np.nan, np.nan]},
    index=range(1, 7))
print("1. 원본:\n", df)
#     a     b    c    d
# 1  10   6.0  NaN  NaN
# 2  20  41.0  2.0  4.0
# 3  30  33.0  NaN  NaN
# 4  40   2.0  3.0  NaN
# 5  50   NaN  4.0  NaN
# 6  60   NaN  NaN  NaN

NaN값이 존재하는 행을 모두 삭제하고 요소만 존재하는 행만 남김
df.dropnp()

#1. df.dropna()
drop_df = df.dropna()   # axis = 0, x축 기준, 행 기준
print("2.  NaN이 하나라도 있으면 행 삭제: \n", drop_df)
#    a     b    c    d
# 2  20  41.0  2.0  4.0

NaN값이 존재하는 열 삭제, 값 존재하는 열만 남김
df.dropnp(axis=1)

drop_df = df.dropna(axis=1)
print("3.  NaN이 하나라도 있으면 열 삭제: \n", drop_df)
#     a
# 1  10
# 2  20
# 3  30
# 4  40
# 5  50
# 6  60

 


원본

df = pd.DataFrame({
    'a':[10, 20, 30, 40, 50, np.nan],
    'b':[6, 41, 33, 2, np.nan, np.nan],
    'c':[np.nan, 2, np.nan, 3, 4, np.nan],
    'd':[np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]},
    index=range(1, 7))
print("1. 원본:\n", df)
#       a     b    c   d
# 1  10.0   6.0  NaN NaN
# 2  20.0  41.0  2.0 NaN
# 3  30.0  33.0  NaN NaN
# 4  40.0   2.0  3.0 NaN
# 5  50.0   NaN  4.0 NaN
# 6   NaN   NaN  NaN NaN

열 / 행의 모든 요소가 NaN값을 갖는 열 / 행만 삭제
df.dropna(how='all')

#2. df.dropna(how = all)    하나의 열 / 행의 요소 값이 모두 NaN의 값을 갖는 경우
drop_df = df.dropna(how='all')   # axis = 0, x축 기준, 행 기준
print("2.  행의 모든값이 NaN이면 삭제: \n", drop_df)
#     a     b    c   d
# 1  10.0   6.0  NaN NaN
# 2  20.0  41.0  2.0 NaN
# 3  30.0  33.0  NaN NaN
# 4  40.0   2.0  3.0 NaN
# 5  50.0   NaN  4.0 NaN

열의 모든 값이 NaN일 때, 해당 열 삭제
df.dropna(axis=1, how='all')

drop_df = df.dropna(axis=1, how='all')
print("3.  열의 모든값이 NaN이면 삭제: \n", drop_df)
#     a     b    c
# 1  10.0   6.0  NaN
# 2  20.0  41.0  2.0
# 3  30.0  33.0  NaN
# 4  40.0   2.0  3.0
# 5  50.0   NaN  4.0
# 6   NaN   NaN  NaN

NaN를 NA로 변경
df.fillna('NA')

fill_df = df.fillna('NA')
print("2. 모든 NaN값을 NA로 변경:\n", fill_df)
#    a   b   c   d
# 1  10   6  NA  NA
# 2  20  41   2  NA
# 3  30  33  NA  NA
# 4  40   2   3  NA
# 5  50  NA   4  NA

특정 컬럼의 NaN값 조정하기

column_fill_df = df.fillna({'d' : -100, 'c':-50})
print("3. 지정된 컬럼의 NaN값을 지정값으로 변경:\n", column_fill_df)
#      a     b     c      d
# 1  10.0   6.0 -50.0 -100.0
# 2  20.0  41.0   2.0 -100.0
# 3  30.0  33.0 -50.0 -100.0
# 4  40.0   2.0   3.0 -100.0
# 5  50.0   NaN   4.0 -100.0
# 6   NaN   NaN -50.0 -100.0

 

반응형

댓글