/ DATA-SCIENCE

Python 데이터분석 라이브러리(8) - Pandas(DataFrame 제어)

Data-Science 강의는 여러 절로 구성되어 있습니다.


DataFrame 조작 (DataFrame 생성)


# DataFrame 조작 (DataFrame 생성)

# random seed 고정
# [0,10) 사이의 정수형 난수를 균등분포로 추출해서 
# 6행 4열 DataFrame 생성
# cloumn과 index는 따로 지정하지 않는다. (column도 숫자로 표현)

import numpy as np
import pandas as pd

np.random.seed(1)
df = pd.DataFrame(np.random.randint(0,10,(6,4)))

display(df)


DataFrame 조작 (index와 column 재정의)


# DataFrame 조작 (index와 column 재정의)

# column : "A", "B", "C", "D"
# index : 날짜를 이용, 2020-01-01부터 1일씩 증가

import numpy as np
import pandas as pd

np.random.seed(1)
df = pd.DataFrame(np.random.randint(0,10,(6,4)))

df.columns = ["A", "B", "C", "D"]
df.index = pd.date_range("20200101", periods=6)
# df.index = pd.date_range("20200101", "20200106")

display(df)


DataFrame 조작 (새로운 column 추가)


# DataFrame 조작 (새로운 column 추가)

# NaN값을 포함하는 "E" column 추가
# "E" column의 데이터 : [7, np.nan, 4, np.nan, 2, np.nan]

import numpy as np
import pandas as pd

np.random.seed(1)
df = pd.DataFrame(np.random.randint(0,10,(6,4)))

df.columns = ["A", "B", "C", "D"]
df.index = pd.date_range("20200101", periods=6)

df["E"] = [7, np.nan, 4, np.nan, 2, np.nan]
# NaN은 float로 간주

display(df)


DataFrame 조작 (결측값 제거)


# DataFrame 조작 (결측값 제거)

# NaN값 제거

import numpy as np
import pandas as pd

np.random.seed(1)
df = pd.DataFrame(np.random.randint(0,10,(6,4)))

df.columns = ["A", "B", "C", "D"]
df.index = pd.date_range("20200101", periods=6)
df["E"] = [7, np.nan, 4, np.nan, 2, np.nan] # NaN은 float로 간주

new_df = df.dropna(how="any")    
                        # (how="any") => NaN이 하나라도 포함되어 있는 행 삭제
                        # (how="all") => 모든 column의 값이 NaN인 행 삭제    
                        # 결과 DataFrame을 return, 원본 변경 X
                        # inplace=True인 경우 원본 변경.
            
display(new_df)


DataFrame 조작 (결측값 대체)


# DataFrame 조작 (결측값 대체)

# NaN값을 다른값으로 대체

import numpy as np
import pandas as pd

np.random.seed(1)
df = pd.DataFrame(np.random.randint(0,10,(6,4)))

df.columns = ["A", "B", "C", "D"]
df.index = pd.date_range("20200101", periods=6)
df["E"] = [7, np.nan, 4, np.nan, 2, np.nan] # NaN은 float로 간주

new_df = df.fillna(value=0)
                        # 결과 DataFrame을 return, 원본 변경 X
                        # inplace=True인 경우 원본 변경.
display(new_df)


DataFrame 조작 (결측값 boolean mask 활용)


# DataFrame 조작 (결측값 boolean mask 활용)

# NaN에 대한 boolean mask활용
# "E" column의 값이 NaN인 행들을 찾아 해당 행의 모든 column 출력

import numpy as np
import pandas as pd

np.random.seed(1)
df = pd.DataFrame(np.random.randint(0,10,(6,4)))

df.columns = ["A", "B", "C", "D"]
df.index = pd.date_range("20200101", periods=6)
df["E"] = [7, np.nan, 4, np.nan, 2, np.nan] # NaN은 float로 간주

display(df.isnull())  # NaN에 대한 boolean mask

display(df.loc[df.isnull()["E"],:])


DataFrame 변형 - 중복행 제거

import numpy as np
import pandas as pd

df=pd.DataFrame({ "k1" : ["one"] * 3 + ["two"] * 4,
                  "k2" : [1,1,2,3,3,4,4] })

display(df)
print(df.duplicated())              # Series형태의 boolean mask
display(df.loc[df.duplicated(),:])  # 중복행 알아내기
display(df.drop_duplicates())       # 중복행 제거

#########

df=pd.DataFrame({ "k1" : ["one"] * 3 + ["two"] * 4,
                  "k2" : [1,1,2,3,3,4,4] })

df["k3"] = np.arange(7)
display(df)
display(df.drop_duplicates())             # 삭제되는 행이 없다.
display(df.drop_duplicates(["k1"]))       # 특정열을 기준으로 중복삭제
display(df.drop_duplicates(["k1","k2"]))  # keep="first"
# df.drop_duplicates(["k1","k2"], keep="last")  # 중복된 마지막 행을 남긴다.

DataFrame 변형 - replace


import numpy as np
import pandas as pd

s = pd.Series([1,-999,2,-999,-1000,3.0])

# 이상치를 찾아서 치환
new_s = s.replace(-999, np.nan)
print(new_s)

new_s = new_s.replace(np.nan,0)  # new_s.fillna(0)
print(new_s)

######

np.random.seed(1)
df = pd.DataFrame(np.random.randint(0,10,(6,4)))

df.columns = ["A", "B", "C", "D"]
df.index = pd.date_range("20200101", periods=6)
df["E"] = [7, np.nan, 4, np.nan, 2, np.nan] # NaN은 float로 간주
display(df)

display(df.replace(np.nan,-100))


DataFrame 변형 - category

# Categories 데이터형
import numpy as np
import pandas as pd

df = pd.DataFrame( {"id" : [1,2,3,4,5,6],
                    "raw_grade" : ["a","b","b","a","a","e"]})
df["grade"] = df["raw_grade"].astype("category")
display(df)

print(df["grade"])

print(df["grade"].cat.categories)   # category 확인

df["grade"].cat.categories = ["good","normal","bad"]  # category 이름 변경

display(df)

# 새로운 category를 정의 ( category의 수를 증감 )
# df["grade"] = df["grade"].cat.set_categories(["very good", "good","normal","bad", "very bad"])
# display(df)

# category는 정의된 순서에 따라서 대소관계를 가진다.
df.sort_values(by="grade")

DataFrame 변형 - 숫자데이터의 category

# 숫자데이터의 category화
import numpy as np
import pandas as pd

ages = [20,22,25,27,21,23,37,31,61,45,41,32]
bins = [18,25,35,60,100]   # 숫자값 구분(총 4개의 구간, 초과~이하)

cats = pd.cut(ages,bins)

print(cats.categories) # 생성된 category 확인

print(cats.codes)  # category의 숫자화 ( 각 성분의 위치 )

print(cats.value_counts())  # 각 category의 count

# 각 category의 이름을 지정
group_names = ["young","youngAdult","middleAge","Senior"]
cats = pd.cut(ages,bins, labels=group_names)
print(cats)

End.


Data-Science 강좌는 아래의 책과 사이트를 참조했습니다. 조금 더 자세한 사항을 알고 싶으시면 해당 사이트를 방문하세요!!