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
댓글