In [1]:
import pandas as pd
In [2]:
df= pd.read_csv('data/titanic_train.csv', sep=',')
In [3]:
df.head()
Out[3]:
In [4]:
df1=pd.read_csv('data/ex1.csv')
In [5]:
df1.head()
Out[5]:
In [6]:
f = open("data/ex1.csv", 'w')
data = """a,b,c,d,message
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo"""
f.write(data)
f.close()
In [7]:
f = open("data/ex2.csv", 'w')
data = """
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo
"""
f.write(data)
f.close()
df2= pd.read_csv('data/ex2.csv', header=None)
df2
Out[7]:
In [8]:
df2= pd.read_csv('data/ex2.csv', names=['a','b','c','d','message'])
df2
Out[8]:
In [9]:
names=['a','b','c','d','message']
df2= pd.read_csv('data/ex2.csv', names=names, index_col='message') # message가 index의 column으로 감
df2
Out[9]:
In [10]:
f = open("data/csv_mindex.csv", 'w')
data = """key1,key2,value1,value2
one,a,1,2
one,b,3,4
one,c,5,6
one,d,7,8
two,a,9,10
two,b,11,12
two,c,13,14
two,d,15,16
"""
f.write(data)
f.close()
- 계층적 색인 지정
In [11]:
parsed= pd.read_csv('data/csv_mindex.csv', index_col=['key1', 'key2'])
parsed
Out[11]:
In [12]:
f = open("data/ex3.txt", 'w')
data = """A B C
aaa -0.264438 -1.026059 -0.619500
bbb 0.927272 0.302904 -0.032399
ccc -0.264273 -0.386314 -0.217601
ddd -0.871859 -0.348382 1.100491
"""
f.write(data)
f.close()
In [13]:
result= pd.read_table('data/ex3.txt', sep='\s+') #\s+ :공백이 하나 이상 발생한 경우 구분
result
Out[13]:
In [14]:
f = open("data/ex4.csv", 'w')
data = """#Hey!
a,b,c,d,message
#by python
#csv file
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo"""
f.write(data)
f.close()
In [15]:
f = open("data/ex4.csv",'r')
skiplist = []
count=0
while True:
line = f.readline()
if not line:
break
if '#' in line :
print(line)
skiplist.append(count)
count += 1
f.close()
skiplist
Out[15]:
In [16]:
f=open('data/ex4.csv', 'r', encoding='utf-8')
lineNum=0
skiplist=[]
while True:
lines=f.readline()
if not lines:
break
if '#' in lines:
skiplist.append(lineNum)
lineNum +=1
f.close()
skiplist
Out[16]:
In [17]:
df1= pd.read_csv('data/ex4.csv', skiprows=[0,2,3]) # 불필요한 줄 지움
df1
Out[17]:
In [18]:
df1= pd.read_csv('data/ex4.csv', skiprows= skiplist) # 불필요한 줄 지움
df2
Out[18]:
In [19]:
f = open("data/ex5.csv", 'w')
data = """something,a,b,c,d,message
one,1,2,3,4,NA
two,5,6,,8,world
three,9,10,11,12,foo
"""
f.write(data)
f.close()
In [20]:
result= pd.read_csv('data/ex5.csv')
result
Out[20]:
In [21]:
pd.isnull(result)
Out[21]:
In [22]:
result=pd.read_csv('data/ex5.csv', na_values=['NULL']) # na_values: 특정한 값을 NaN으로 취급하고 싶을 때 사용, 1 넣으면 1이 NaN으로 바뀜
result
Out[22]:
In [23]:
sentinels={'message': ['foo','world'], 'something': ['two']}
result=pd.read_csv('data/ex5.csv', na_values=sentinels)
result
Out[23]:
엑셀파일읽기¶
In [24]:
xlsx = 'data/ex01.xlsx'
frame= pd.read_excel(xlsx, 'Sheet1')
frame
Out[24]:
엑셀파일저장¶
In [25]:
writer= pd.ExcelWriter('data/ex02.xlsx')
frame.to_excel(writer, 'Sheet1')
writer.save()
누락된 데이터 처리¶
인자 | 설명 |
---|---|
dropna | 누락된 데이터가 있는 축(low,column)을 제외시킨다. 어느정도의 누락데이터까지 용인할것인지 지정 할 수 있다. |
fillna | 누락된 데이터를 대신할 값을 채우거나 'ffill'이나 'bfill'같은 보간 메서드를 적용한다. |
isnull | 누락되거나 NA인 값을 알려주는 불리언 값이 저장된 같은 형의 객체를 반환 |
notnull | isnull과 반대되는 메서드 |
In [24]:
import numpy as np
import pandas as pd
In [25]:
string_data = pd.Series(['aardvark', 'artichoke', np.nan, 'avocado'])
string_data
Out[25]:
In [26]:
string_data.isnull()
Out[26]:
In [27]:
string_data[0]= None
string_data.isnull()
Out[27]:
In [28]:
from numpy import nan as NA
data= pd.Series([1,NA,3.5,NA,7])
data.dropna()
Out[28]:
In [29]:
data[data.notnull()] #data.dropna()와 같은 결과
Out[29]:
In [30]:
data = pd.DataFrame([[1., 6.5, 3.], [1., NA, NA],
[NA, NA, NA], [NA, 6.5, 3.]])
data
Out[30]:
In [31]:
cleand=data.dropna() #NaN이 하나라도 들어있으면 사라짐
cleand
Out[31]:
In [32]:
cleand= data.dropna(how="all") # how=all : 모두 NaN이면 삭제됨
cleand
Out[32]:
In [33]:
# 4번 열을 추가하고 NA 값으로 지정
data[4]=NA
data
Out[33]:
In [34]:
cleand= data.dropna(axis='columns', how="all")
#cleand= data.dropna(axis='1', how="all") 위의 코드와 동일
cleand
Out[34]:
In [35]:
df= pd.DataFrame(np.random.randn(7,3)) #세로가 7개 가로가 3개인
df
Out[35]:
In [36]:
df.iloc[0:3,1]=NA
df.iloc[:1,2]=NA
df
Out[36]:
In [37]:
cleaned= df.dropna(thresh=2) # 2개이상 NaN이 있으면 삭제됨
cleaned
Out[37]:
결측치 채우기¶
In [38]:
df
Out[38]:
In [39]:
filled=df.fillna(0) # NaN을 0으로 대체
filled
Out[39]:
In [40]:
filled2=df.fillna({1:0.9, 2:0})
filled2
Out[40]:
In [41]:
df.fillna(0, inplace=False) #원본데이터 안바뀜
df
Out[41]:
In [42]:
df.fillna(0, inplace=True) #원본데이터 0으로 바뀜
df
Out[42]:
In [43]:
df= pd.DataFrame(np.random.randn(7,3))
df.iloc[2:,1]=NA
df.iloc[4:,2]=NA
df
Out[43]:
In [44]:
filled= df.fillna(method='ffill')
filled
Out[44]:
In [45]:
filled= df.fillna(method='ffill', limit=2) #2개만 채움
filled
Out[45]:
def.fillna(value=, method='ffill', axis=0, inplace=, limit=)¶
- value : 비어있는 값을 채울 스칼라 값이나 dictonary 형식의 객체
- method : 보간법(기본=ffill)
- axis : 값을 채워넣을 축(기본 axis=0)
- inplace : 복사본을 생성하지 않고 호출한 객체에 값을 반환(기본값=False )
- limit : 값을 앞 또는 뒤로 몇개까지 채울지 지정
In [46]:
data = pd.DataFrame({'k1': ['one', 'two'] * 3 + ['two'],
'k2': [1, 1, 2, 3, 3, 4, 4]})
data
Out[46]:
In [47]:
data.duplicated() # 중복이 되는 것 True
Out[47]:
In [48]:
data.drop_duplicates() # 중복된 것 사라짐
Out[48]:
In [49]:
data['v1']=range(7)
data
Out[49]:
In [50]:
data.drop_duplicates(['k1']) #k1의 중복요소 삭제
Out[50]:
In [51]:
data.drop_duplicates(['k2'])#k2의 중복요소 삭제
Out[51]:
In [52]:
data.drop_duplicates(['v1']) # 중복이 없어서 똑같이 나옴
Out[52]:
In [53]:
data
Out[53]:
In [54]:
data.drop_duplicates(['k1','k2'], keep='last') # keep='last' : 마지막이 살아남음
# k1과 k2의 값이 같은 건 two 4 5/ two 4 6 이 중 마지막이 살아남음
Out[54]:
데이터 변형하기¶
In [55]:
data = pd.DataFrame({'food': ['bacon', 'pulled pork', 'bacon',
'Pastrami', 'corned beef', 'Bacon',
'pastrami', 'honey ham', 'nova lox'],
'ounces': [4, 3, 12, 6, 7.5, 8, 3, 5, 6]})
data
Out[55]:
In [56]:
meat_to_animal = {
'bacon': 'pig',
'pulled pork': 'pig',
'pastrami': 'cow',
'corned beef': 'cow',
'honey ham': 'pig',
'nova lox': 'salmon'
}
meat_to_animal
Out[56]:
In [57]:
#소문자로 바꾸기
lower_cased=data['food'].str.lower()
lower_cased
Out[57]:
In [58]:
data['animal']= lower_cased.map(meat_to_animal)
data
Out[58]:
In [60]:
#lower_cased=data['food'].str.lower()
#data['animal']= lower_cased.map(meat_to_animal)
data['animal']= data['food'].map(lambda x: meat_to_animal[x.lower()])
data
Out[60]:
In [62]:
data=pd.Series([1., -999., 2., -999., -1000., 3.])
data
Out[62]:
In [63]:
data2 = data.replace(-999, np.nan)
data2
Out[63]:
In [64]:
data2 = data.replace([-999, -1000], np.nan)
data2
Out[64]:
In [65]:
data2 = data.replace([-999, -1000], [np.nan, 0])
data2
Out[65]:
In [66]:
data2= data.replace({-999.:np.nan, -1000.:0})
#-999 ->Nan , -1000 ->0
data2
Out[66]:
In [79]:
data = pd.DataFrame(np.arange(12).reshape((3, 4)),
index=['Ohio', 'Colorado', 'New York'],
columns=['one', 'two', 'three', 'four'])
data
Out[79]:
In [80]:
transform= lambda x:x[:4].upper() #X를 4자리로 끊음
data.index.map(transform)
Out[80]:
In [81]:
data.index
Out[81]:
In [82]:
data.index= data.index.map(transform)
data
Out[82]:
- str.title : 단어의 시작 부분에 있는 문자는 대문자로, 나머지는 모두 소문자로 만든다.
In [83]:
data.rename(index=str.title, columns=str.upper)
Out[83]:
In [84]:
data
Out[84]:
In [85]:
data.rename(index={'OHIO':'INDIANA'}, columns={'three':'peekaboo'})
Out[85]:
In [86]:
data
Out[86]:
In [90]:
data.rename(index={'OHIO':'INDIANA'}, inplace=True) # 기존 객체를 수정
data
Out[90]:
In [91]:
data
Out[91]:
- 나이 나누기
18~25(0)
26~35(1)
35~60(2)
60이상(3)
In [94]:
ages = [20, 22, 25, 27, 21, 23, 37, 31, 61, 45, 41, 32]
In [95]:
bins=[18,25,35,60,100] # 각 구간을 나눠줄 숫자값
cats= pd.cut(ages,bins) #pd.cut(카테고리화 할 숫자데이터, 자를 구간의 구분값)
cats
Out[95]:
In [96]:
cats.codes #각 성분이 몇번쨰 구간에 속해있는지 정수 index로 표시됨
Out[96]:
In [172]:
cats.categories # ( ] : 왼쪽 미포함, 오른쪽 포함
Out[172]:
In [97]:
pd.value_counts(cats) # 각 구간의 성분의 개수
Out[97]:
In [98]:
pd.cut(ages,[18,25,35,60,100], right=False) # [ ) : 왼쪽 포함, 오른쪽 미포함
Out[98]:
In [99]:
pd.cut(ages,[18,25,35,60,100], right=True) # 위와 반대
Out[99]:
In [100]:
group_names= ['Youth', 'youngAdult', 'MiddleAged', 'Senior']
In [101]:
data2= pd.cut(ages,bins,labels=group_names)
data2
Out[101]:
In [102]:
data2.value_counts()
Out[102]:
각 구간 구분값을 bin으로 정의해서 나누었는데 pandas에서 알아서 판단하여 데이터의 길이를 잘라주고 구간을 설정할 수도 있음.
In [105]:
data= np.random.rand(20)
data
Out[105]:
데이터 성분값을 기준으로 자동으로 구간을 나누게 하기 위해서 나눌 구간의 개수만 입력해준다 (성분의 최소값~최대값을 보고 4개구간 나눔)
In [106]:
pd.cut(data, 4, precision=2) #precision=2 소수점 2자리까지 표현
Out[106]:
In [107]:
data= pd.DataFrame(np.random.randn(1000,4)) #n붙이면 정규분포..
data
Out[107]:
In [108]:
data.describe()
Out[108]:
In [109]:
data[2] #column 2
Out[109]:
In [111]:
col= data[2]
col[np.abs(col)>3]
Out[111]:
In [112]:
data[(np.abs(data)>3).any(1)] #data가 절대값이 3보다 큰게 하나라도 있으면 무조건 출력
Out[112]:
- np.sign(x) : x<0일 때 -1, x==0일 떄 0 ,x>0일 때 1을 반환
In [120]:
data[np.abs(data)>3]= np.sign(data)*3 # 절대값이 3보다 큰 값들을 -1 또는 1로 나타내는데 *3을 해서 3 또는 -3으로 나타나짐
data.describe()
Out[120]:
In [122]:
data.head()
Out[122]:
In [121]:
np.sign(data).head() # 부호를 나타냄
Out[121]:
In [136]:
df = pd.DataFrame(np.arange(5 * 4).reshape((5, 4)))
df
Out[136]:
In [137]:
sampler = np.random.permutation(5) # 무작위로 섞인 배열 만든다
sampler
Out[137]:
In [140]:
df.take(sampler) #sampler 의 값을 인덱스로
Out[140]:
In [147]:
df.sample(n=3) # 3개의 인덱스 랜덤하게 추출
Out[147]:
In [151]:
choices = pd.Series([5, 7, -1, 6, 4])
choices
Out[151]:
In [152]:
draws = choices.sample(n=10, replace=True)
draws
Out[152]:
onehot 인코딩¶
- 문자를 숫자로 바꾸어 주는 방법 중 하나로 onehot인코딩이 있다.
- 가변수로 만들어주는 것인데, 이는 0과 1로 이루어진 열을 나타낸다.
- 1은 있다 0은 없다를 나타낸다.
In [189]:
df = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'b'],
'data1': range(6)})
df
Out[189]:
In [190]:
pd.get_dummies(df['key']) #df['key]열만 get_dummies해줌
Out[190]:
In [191]:
dummies = pd.get_dummies(df['key'])
dummies
Out[191]:
In [208]:
dummies = pd.get_dummies(df['key'],prefix='key') # prefix를 활용하여 좀 더 명시적으로 표현
#기존 df의 컬럼을 반영해주기 위해서 작성
dummies
Out[208]:
In [193]:
df_with_dummy = df[['data1']].join(dummies)
df_with_dummy
Out[193]:
In [210]:
mnames = ['movie_id', 'title', 'genres']
movies = pd.read_table('movies.dat', sep='::', header=None, names=mnames)
movies[:10]
Out[210]:
In [211]:
all_genres=[]
for x in movies.genres:
all_genres.extend(x.split('|'))
genres=pd.unique(all_genres)
genres
# genres의 장르를 중복없이 나오게 하기
Out[211]:
In [212]:
zero_matrix=np.zeros((len(movies), len(genres)))
dummies= pd.DataFrame(zero_matrix, columns=genres)
dummies
Out[212]:
In [213]:
gen= movies.genres[0]
gen.split('|')
dummies.columns.get_indexer(gen.split('|'))
Out[213]:
In [214]:
dummies
Out[214]:
- enumerate
: 보통 for문과 함께 사용
: 인덱스 값을 포함하는 enumerate객체를 리턴
: for문처럼 반복되는 구간에서 객체가 현재 어느 위치에 있는지 알려주는 인덱스 값이 필요할 때 사용하면 유용
In [215]:
for i, gen in enumerate(movies.genres):
indices = dummies.columns.get_indexer(gen.split('|')) #gen 첫번째 줄에 나와있는 string
dummies.iloc[i, indices] = 1
dummies
Out[215]:
In [216]:
pd.set_option('display.max_columns', 25)
#pd.set_option('display.max_row', 10)
movies_windic= movies.join(dummies.add_prefix('Genre_'))
movies_windic.head()
Out[216]:
In [231]:
np.random.seed(12345)
values = np.random.rand(10)
values
Out[231]:
In [232]:
bins=[0, 0.2, 0.4, 0.6, 0.8, 1]
pd.get_dummies(pd.cut(values, bins))
Out[232]:
In [243]:
val= ' a,b, guido '
val.split(',') #공백포함됨
Out[243]:
In [244]:
val
Out[244]:
In [245]:
val= 'a,b, guido'
val.strip() #양끝 공백 제거
Out[245]:
In [246]:
pieces = [x.strip() for x in val.split(',')]
pieces
Out[246]:
In [221]:
first, second, third= pieces
first+ '::'+ second+ '::'+ third
Out[221]:
In [247]:
first
Out[247]:
In [249]:
pieces
Out[249]:
In [222]:
'::'.join(pieces)
Out[222]:
In [223]:
'guido' in val
Out[223]:
In [256]:
val.index(',')
Out[256]:
In [257]:
val.find(':')
Out[257]:
In [248]:
val.find(',')
Out[248]:
In [259]:
val.index(':')
In [261]:
val.count(',')
Out[261]:
In [262]:
val.replace(',', '::')
Out[262]:
In [263]:
val.replace(',', '')
Out[263]:
'Python' 카테고리의 다른 글
Python_판다스_데이터분석 (0) | 2020.09.14 |
---|---|
Python_example (0) | 2020.09.11 |
Python_pandas 문제 (0) | 2020.09.09 |
Python_pandas(판다스):시리즈,데이터프레임,색인,인덱싱,sorting (0) | 2020.09.09 |
Python 기초09_vectorize (0) | 2020.09.08 |