누락값 (NaN,NAN,nan)
from numpy import NaN,NAN,nan
NaN == True
NaN == False
NaN == ''
import pandas as pd
pd.isnull(NaN)
pd.isnull(NAN)
pd.isnull(nan)
pd.isnull('')
pd.notnull(NaN)
visited = pd.read_csv('./data/survey_visited.csv')
survey = pd.read_csv('./data/survey_survey.csv')
vs = visited.merge(survey, left_on='ident',right_on='taken')
vs
#범위를 지정하여 데이터를 추출할 때 누락값이 생기는 경우
gapminder = pd.read_csv('./data/gapminder.tsv', sep='\t')
gapminder.sample() #무작위로 하나만 추출
life_exp = gapminder.groupby(['year'])['lifeExp'].mean()
life_exp
life_exp.reindex([range(2000,2010),])
#누락값 개수 구하기
ebola = pd.read_csv('./data/country_timeseries.csv')
ebola.sample()
ebola.info()
ebola.isnull().sum() #카운트는 비어있지 않은 것만 표시, isnull().sum()은 비어있는 데이터만 표시
ebola.fillna(0,inplace=False).isnull().sum() #메서드체이닝 함수끼리 연결
ebola.fillna(method='ffill').head(10) #ffill 발생하기 전(앞) 데이터로 채워줌
ebola.fillna(method='bfill').head(10) #bfill 발생하기 후(뒤) 데이터로 채워줌
ebola.interpolate().head(10) #interpolate 양쪽의 값을 비교하여 평균값을 넣어줌
#누락값 삭제 dropna()
ebola.shape
ebola.dropna().shape #any 하나라도 NaN값이면 제거, all은 전체가 NaN일 때 제거
ebola.columns
ebola['Cases_multiple'] = ebola['Cases_Guinea']+ebola['Cases_Liberia']+ebola['Deaths_SierraLeone']
ebola.loc[:,['Cases_Guinea', 'Cases_Liberia', 'Cases_SierraLeone','Cases_multiple']].head(10)
ebola.Cases_Guinea.sum(skipna=True) #skipna 안넣어도 값 똑같음(nan 값을 빼고 계산해라)
ebola.Cases_Guinea.sum(skipna=False) #nan값을 스킵하지 않고(False하고) 계산해라 값은 항상 nan이 나옴
#melt()
pew = pd.read_csv('./data/pew.csv')
pew.head(2)
pd.melt(pew, id_vars='religion')
pd.melt(pew, id_vars='religion', var_name='income', value_name='count')
billboard = pd.read_csv('./data/billboard.csv')
billboard.head(2)
pd.melt(billboard, id_vars=['year', 'artist', 'track', 'time', 'date.entered'], var_name='week', value_name='rating')
#하나의 열이 여러 의미를 가지는 경우
ebola.head(2)
ebola_melt = ebola.melt()
ebola_melt.head(2)
ebola_melt = pd.melt(ebola,id_vars=['Date','Day'])
ebola_melt.head(2)
variable_split = ebola_melt.variable.str.split('_')
variable_split.tail(100)
variable_split[2]
variable_split.str.get(0)
ebola_melt['status'] = variable_split.str.get(0)
ebola_melt['country'] = variable_split.str.get(1)
#여러 열을 하나로 정리 melt, pivot_table
weather = pd.read_csv('./data/weather.csv')
weather.head(4)
weather.columns
weather_melt = pd.melt(weather, id_vars=['id', 'year', 'month', 'element'], var_name='day', value_name='temp')
weather_melt.sample(10)
weather_melt.pivot_table(index=['id','year','month','day'],
columns='element',
values='temp'
).reset_index()
weather_melt.pivot_table(index=['id','year','month','day'],
columns='element',
values='temp',
dropna=False
).reset_index()
#중복 제거
billboard_melt = pd.melt(billboard, id_vars=['year','artist','track','time','date.entered'],var_name='week', value_name='rating')
billboard_melt.head(2)
billboard_melt[billboard_melt.track=='Loser']
billboard_songs = billboard_melt[['year','artist','track','time']]
billboard_songs.head(2)
billboard_songs = billboard_songs.drop_duplicates() #중복되는 것 제거
billboard_songs.head(2)
billboard_songs.reset_index(inplace=True)
billboard_songs.columns = ['id', 'year', 'artist', 'track', 'time']
billboard_ratings = billboard_melt.merge(billboard_songs, on=['year', 'artist', 'track', 'time']) #on은 양쪽에 똑같은 이름으로 필드가 있을 때 쓰임
#대용량 데이터
import os, urllib.request
with open('./data/raw_data_urls.txt','r') as data_urls:
for line, url in enumerate(data_urls):
#print(line)
#print(url)
if line == 5:
break
fn = url.split('/')[-1].strip()
#print(fn)
fp = os.path.join('','./data', fn)
print(fp)
urllib.request.urlretrieve(url,fp)
import glob
nyc_taxi_data = glob.glob('./data/fhv_*.csv')
nyc_taxi_data
taxi1 = pd.read_csv(nyc_taxi_data[0])
taxi2 = pd.read_csv(nyc_taxi_data[1])
taxi3 = pd.read_csv(nyc_taxi_data[2])
taxi4 = pd.read_csv(nyc_taxi_data[3])
taxi5 = pd.read_csv(nyc_taxi_data[4])
pd.concat([taxi1, taxi2, taxi3, taxi4, taxi5])
list_taxi_df = []
for filename in nyc_taxi_data:
#print(filename)
df = pd.read_csv(filename)
list_taxi_df.append(df)
list_taxi_df
#자료형 변환
import seaborn as sns
tips = sns.load_dataset("tips")
tips.head()
tips.info()
tips['sex_str']=tips['sex'].astype(str)
tips.info()
tips['total_bill_str'] = tips['total_bill'].astype(str)
tips.info()
tips['total_bill_str']=tips['total_bill_str'].astype(float)
tips.info()
tips['total_bill_str']=tips['total_bill_str'].astype(int)
tips.info() #int64로 변환 안됨
import warnings
warnings.filterwarnings('ignore') #경고메세지 무시하는 코드
tips_sub_miss.loc[[1,2,5,7],'total_bill'] = 'missing'
tips_sub_miss.head()
tips_sub_miss['total_bill'].astype(float,errors='ignore') #missing이라는 문자가 있어서 float로 처리가 안되는데, 에러 함수를 넣어주면 처리 가능
pd.to_numeric(tips_sub_miss['total_bill'],errors='coerce',downcast='float') #downcast float64 -> float32
append vs concat
append는 라인 한줄만 연결가능(세로로만 결합이 가능)
concat은 여러개의 컬럼 연결 가능함(가로, 세로 모두 가능)
fillna()
결측값 채워주는 용도 fillna(?) 값을 nan(빈공간) 대신에 채워주는 것
fillna(, inplace=False)는 원본은 바꾸지말고 지금 결과값에만 출력을 해달라는 의미
id_var 그대로 유지 할 컬럼(variable = 변수, value = 값)
pivot_table
64bit/ 32bit 컴퓨터에서 한번에 읽어들이는 양
오브젝트는 문자열을 뜻함
카테고리는 범주안에서만 입력 가능