pd.DataFrame(dictioanry변수명)
import pandas as pd
# 딕셔너리 정의
my_dict = {'이름': ['사나', '모모', '쯔위', '나연'],
'등급': ['Gold', 'Bronze', 'Silver', 'Gold'],
'점수': [56000, 23000, 44000, 52000]}
# dataframe 생성
df = pd.DataFrame(my_dict)
print(df)
pd.DataFrame(columns = column리스트명, data = array변수명)
# array 정의
import numpy as np
arr = np.array([['사나', 'Gold', 56000],
['모모', 'Bronze', 23000],
['쯔위', 'Silver', 44000],
['나연', 'Gold', 52000]]
)
# column 리스트 정의
cols = ['name', 'level', 'score']
# dataframe 생성
import pandas as pd
df = pd.DataFrame(columns = cols, data = arr)
print(df)
pd.read_csv('파일명')
import pandas as pd
# 현재 경로에 있는 real_estate_price.csv 파일을 dataframe으로 정의
df = pd.read_csv('./real_estate_price.csv', encoding = 'cp949')
DataFrame변수명.head()
: 상위 5개행 미리보기DataFrame변수명.tail()
: 하위 5개행 미리보기dataframe변수명.index
DataFrame변수명.index = 새로운 index리스트
dataframe변수명.reset_index(drop = True, inplace = True)
index 초기화는 기존 index를 버리고, 0부터 순차적으로 증가하는 정수 index가 할당된다.
기존 index를 버릴지, 보존할지 여부는 parameter에 정의할 수 있다.
drop = True
: 기존의 index를 버린다drop = False
: 기존의 index를 보존한다inplace = True
: 기존 dataframe에 업데이트 한다inplace = False
: display만하고 기존 dataframe에 업데이트 안 한다대개, 초기화(reset)와 버리기(drop) 등의 method에 inplace 파라미터가 있는 경우가 많다. 이는 update 여부를 결정하는 parameter로 신중하게 다뤄야 한다. 처음에 inplace = False로 설정하고 결과를 확인한 다음에 True값을 사용하는 것을 권장한다.
dataframe변수명.columns
dataframe변수명.columns = 신규 칼럼 리스트
# 신규 칼럼 리스트 정의
new_cols = ['시군구', '번지', '본번']
# 칼럼 변경
df.columns = new_cols
dataframe변수명.rename(columns = {"변경전 칼럼명" : "변경후 칼럼명"}, inplace = True)
df.rename(columns = {"거래금액(만원)": "거래금액"}, inplace = True)
dataframe변수명.shape
df.shape # output is (70,3)
DataFrame변수명.values
DataFrame의 Value를 조회하면 2차원 Array형태로 데이터를 리턴한다.
DataFrame변수명.dtypes
각 칼럼별로 데이터 타입을 확인할 수 있다.
dataframe변수명[index명] = dataframe변수명[index명].astype(바꾸고 싶은 데이터타입)
# '전용면적' 칼럼의 데이터타입을 int로 변경
df['전용면적'].astype("int")
# 정의
df['전용면적'] = df['전용면적'].astype("int")
dataframe변수명.info()
DataFrame변수명.describe()
DataFrmae변수명[column명].unique()
DataFrmae변수명[column명].value_counts()
DataFrame변수명.groupby(by = "grouping칼럼명").통계함수()
# '계약년월' 칼럼의 평균
df.groupby("계약년월").mean()
# '계약년월' 칼럼의 중앙값
df.groupby("계약년월").median()
DataFrame변수명[column명]
DataFrame변수명[column명][row명]
DataFrame변수명.loc[index명, column명]
: loc 방식DataFrame변수명.iloc[row번호, column번호]
: iloc 방식DataFrame변수명[시작index명:끝index명, 시작column명:끝column명]
DataFrame변수명.loc[시작index명:끝index명, 시작column명:끝column명]
: loc 방식DataFrame변수명.iloc[시작row번호:끝row번호, 시작Column번호:끝Column번호]
: iloc 방식. 콜론(:) 앞/뒤 번호는 생략 가능. 생략 시 처음부터 끝까지 가져온다는 의미.DataFrame변수명.loc[조건식, 시작column명:끝Column명]
# '계약년월'의 값이 202003인 row 추출
df.loc[df['계약년월'] == 202003, :]
# '계약년월'의 값이 202003인 row와 '전용면적'의 값이 59이상인 row 추출
df.loc[(df['계약년월'] == 202003) & (df['전용면적'] > 59), :]
DataFrame은 column 단위로 데이터에 접근한거나, loc,iloc 메서드를 사용하여 데이터를 개별로 접근이 가능하다.
dataframe변수[신규column명] = 초기값
초기값을 임의의 static 데이터로 넣어줄 수도 있고, 함수를 이용하여 값을 설정할 수도 있으며, 기존 칼럼의 값을 조작하여 넣을 수도 있다.
# '계약년도' 칼럼을 새로 만들고 2020을 값으로 넣는다
df['계약년도'] = 2020
1) apply 메서드 사용
DataFrame변수명[기존column명].apply(함수명)
# '계약년도' 칼럼의 값에 문자열 인덱싱하고 int 변환 후 '계약년도2' 칼럼을 새로 생성
df['계약년도2'] = df['계약년도'].apply(lambda x: int(str(x)[:4]))
2) string 메서드 사용
DataFrame변수명.str.stirng메서드()
# '거래금액(만원)' 칼럼 데이터에 있는 쉼표(,)를 없애고 동일한 칼럼에 저장
df['거래금액(만원)'] = df['거래금액(만원)'].str.replace(",", "")
# '거래금액(만원)' 칼럼 데이터에 있는 쉼표(,)를 없애고 int로 데이터타입 변환 후 동일한 칼럼에 저장
df['거래금액(만원)'] = df['거래금액(만원)'].str.replace(",", "").astype("int")
dataframe변수명.info()
: 각 컬럼별 non-null count를 리턴한다
dataframe변수명.isnull().sum(axis = 0)
: 각 컬럼별 null값 개수를 리턴한다
sum(dataframe변수명['column명'].isnull())
: 하나의 칼럼의 null값 개수를 리턴한다
결측치 처리는 결측치의 양에 따라서 drop과 fill로 구분된다.
1) Drop
결측치를 버리는 결정을 할 때는, 데이터 양이 충분한지, 이 데이터를 버려도 모델링에 문제가 없을지 여부를 충분히 검토 후 버린다. 데이터 편향이 생길 위험이 있다.
row를 기준으로 버리기
DataFrame변수명.dropna(subset = 기준 column명, inplace = True)
결측치가 10% 미만일때 row 단위로 데이터를 버리는게 일반적이다.
column을 기준으로 버리기
DataFrame변수명.drop(columns = "Drop column명", inplace = True)
결측치가 30% 이상이고 특정 칼럼 내에 결측치가 너무 많을 경우, 해당 칼럼은 데이터로써의 의미가 없다고 판단하여 Column단위로 버린다. 다만, Data에 대한 도메인 지식을 바탕으로, Drop했을때 정말 문제가 없을지 여부를 면밀히 검토후에 Drop하는 것이 필요하다.
<예제>
# 결측치가 존재하는 row를 기준으로 Drop
df.dropna(subset = ['거래금액'], inplace = True)
# 결측치가 존재하는 column을 기준으로 Drop
df.drop(columns = "전용면적", inplace = True)
2) Fill
DataFrame변수명.fillna(method = "bfill")
DataFrame변수명.fillna(method = "ffill")
DataFrame변수명[df칼럼명].fillna(DataFrame변수명[df칼럼명].mean(), inplace = True)
DataFrame변수명[df칼럼명].fillna(DataFrame변수명[df칼럼명].median(), inplace = True)
DataFrame변수명[df칼럼명].fillna(DataFrame변수명[df칼럼명].min(), inplace = True)
DataFrame변수명[df칼럼명].fillna(DataFrame변수명[df칼럼명].max(), inplace = True)
DataFrame변수명[df칼럼명].fillna(DataFrame변수명[df칼럼명].mode()[인덱스번호])
<예제>
# before fill
kospi_df['close'] = kospi_df['close'].fillna(method = 'bfill')
# forward fill
kospi_df['volume'] = kospi_df['volume'].fillna(method = 'ffill')
# Numerical Data의 평균값 fill
df_copy_3['전용면적'] = df_copy_3['전용면적'].fillna(df3['전용면적'].mean().astype("int"), inplace = True)
# 거래금액에서 null값이 아닌 row만 따로 추출 -> 추출한 row들의 value값들만 뽑아서, int로 데이터타입 변환 -> 중앙값 계산
median_price = np.median(df_copy_3.loc[df_copy_3['거래금액'].notnull(), "거래금액"].values.astype("int") )
# Numerical Data의 중앙값 Fill & Data Type 변경
df_copy_3['거래금액'] = df_copy_3['거래금액'].fillna(median_price).astype("int")
# mode 함수를 사용하여 Categorical Data fill
salary_df['job_title'] = salary_df['job_title'].fillna(salary_df['job_title'].mode()[0])
신규DataFrame변수명 = pd.get_dummies(DataFrame변수명, columns = [One-Hot Encoding 하고싶은 칼럼 리스트])
DataFrame변수명 = pd.concat([이어붙일 DataFrame변수명 리스트], axis = 기준 축)
<예제>
salary_df.shape # output is (3755, 11)
salary_df_company_size.shape # output is (3755, 3)
# salary_df와 salary_df_company_sized의 row 개수가 동일하기 때문에 두개의 dataframe을 옆으로(column축) 합친다
salary_df_new = pd.concat([salary_df, salary_df_company_size], axis = 1)
DataFrame변수명 = pd.merge(dataframe_1, dataframe_2, on = 기준 column명, how = join방식)
<예제> inner join
# 'ID' column을 기준으로 sales_df와 user_df의 공통된 부분만 합친다
new_df = pd.merge(sales_df, user_df, on = 'ID', how = 'inner')
# join 하기 전 각 df 모양 확인
sales_df.shape, user_df.shape # output is ((101692, 9), (3590, 4))
# join 한 후 df 모양 확인. row의 개수가 101692보다 작아졌다. 6개의 row가 공통 부분이 아니라는 것을 확인할 수 있다.
new_df.shape # output is (101686, 12)
<예제> left outer join
new_df_2 = pd.merge(sales_df, user_df, on = 'ID', how = 'left')
# join을 한 df 모양 확인. sales_df의 row 개수와 동일한 것을 확인할 수 있다.
new_df_2.shape # output is (101692, 12)
<예제> full outer join
new_df_3 = pd.merge(sales_df, user_df, on = 'ID', how = 'outer')
# join한 후 모양 확인. row의 개수가 sales_df보다 늘어난 것을 확인할 수 있다. 왜???
new_df_3.shape # output is (101741, 12)
기존 입력변수들의 조합으로 새로운 특징을 생성하는 방식. Auto Encoder, PCA 등