2021. 8. 20. 01:15ㆍpython/pandas, numpy
# NaN
# NaN : Not a Number ( 일반적인 NaN의 의미 ) => 숫자로 간주 => 숫자 연산이 가능 -> 10 + NaN = NaN (0)
# Pandas에서는 NaN을 조금 다른의미로 사용해요! => missing value(결치값 : 값이없다 )를 의미하는 값.
# NULL : 값이 없어요! (일반적인 프로그래밍에서 사용하는 값) / 가르키는 object가 없다 None
-missing value 와 nan의 차이
missing value - 데이터를 뽑는도중 어느순간 망가져 값이 안나옴 / 원래 잇어야 되는데 없다
NULL - 임의로 값이 없음을 표현 (python은 None)
# DataFrame의 index와 column명을 제어해보아요!!
import numpy as np
import pandas as pd
data = {'이름': ['아이유','김연아','홍길동','강감찬'],
'학과': ['수학과','기계','철학과','경영학과'],
'학년': [1, 4, 2, 3],
'평점': [1.5, 3.8, 2.9, 4.3]}
df = pd.DataFrame(data)
display(df)

df = pd.DataFrame(data),
columns=['학과','이름','학년','평점','등급'],
#로 (1)위치 변경가능 (2)새로운colum 추가[단 값은 nan]
index=['one','two','three','four'])
#숫자 index가 문자 index로 지정

display(df.describe()) 기본적인 수치분석을 해준다 ( describe : 묘사하다 )

count : 숫자가 몇개있냐
mean : 평균 은 outliar 극단값에 영향이 크다 왜나햐만 전체 데이터가 외곡된다
std : 표준편차
25,50(중위값),75% - 1사분익값?, ~
# DataFrame을 사용하려면 어떻게 해야 하나요?
# indexing, slicing, boolean indexing, fancy indexing
import numpy as np
import pandas as pd
data = {'이름': ['아이유','김연아','홍길동','강감찬','이순신'],
'학과': ['수학과','기계','철학과','경영학과','철학'],
'학년': [1, 4, 2, 3, 2],
'평점': [1.5, 3.8, 2.9, 4.3, 4.4]}
df = pd.DataFrame(data,
columns=['학과','이름','학년','평점'],
index=['one','two','three','four', 'five'])
display(df)

# 1. DataFrame에서 특정 column을 추출할 수 있어요!
print(df['이름']) # Series로 결과가 return되요!! ( 0 )
# print(df.이름) # 이렇게도 사용이 가능하지만 잘 사용되지 않아요! ( X )

# 2. 이렇게 추출한 Series는 DataFrame안의 데이터를 보여주는 View의 역할을 수행.(원본 바뀜)
하기때문에 copy를 이용
s_name = df['이름']
# s_name = df['이름'].copy() # copy()를 이용하면 새로운 Series를 생성할 수 있어요!
# print(s_name)
s_name['one'] = '장범준'
print(s_name)
display(df)

# 3. 2개 이상의 column을 추출하려면 어떻게 해야 하나요? => Fancy indexing
# 결과는 당연히 DataFrame으로 return되요!
display(df[['이름', '평점']])
# 4. DataFrame에서 특정 column에 값을 수정하려면 어떻게 해야 하나요?
# df['등급'] = ['A','A','A','A','A']
# df['등급'] = 'A'
# df['등급'] = ['A','C','D','A','B']
df['등급'] = np.array(['A','C','D','A','B'])
display(df)


# 4. DataFrame에서 특정 column에 값을 수정하려면 어떻게 해야 하나요?
# df['등급'] = 'A' # 은 broadcasting 때문에 ['A','A','A','A','A'] 와 같다
# df['등급'] = ['A','C','D','A','B']
df['등급'] = np.array(['A','C','D','A','B'])
display(df)
# 5. DataFrame안에 들어있는 값들만 추출하고 싶어요!
# print(df.values)
# [['수학과' '아이유' 1 1.5 nan]
# ['기계' '김연아' 4 3.8 nan]
# ['철학과' '홍길동' 2 2.9 nan]
# ['경영학과' '강감찬' 3 4.3 nan]
# ['철학' '이순신' 2 4.4 nan]]
# 이름값과 평점값만 ndarray로 추출하고 싶어요!
(1)print(df[['이름', '평점']].to_numpy())
(2)print(df[['이름', '평점']].values)
# 위 둘다 같은 뜻

# 6. 새로운 column을 DataFrame에 추가하려면 어떻게 해야 하나요?
방법.1
# df['나이'] = [20,25,21,24,29] # 모든 record에 값을 다 채워줘야 해요!
# df['나이'] = [20,25,21,24] # 이와 같은 경우는 error
## 새로운 이름의 colum은 추가 (df['나이'])
## 기존 이름의 colum은 배치 (df['이름'])
방법.2
(1) s = pd.Series([20,25,21,24,29], # series를 만든다
(2) index=['one','two','three','four', 'five'])
(3) df['나이'] = s # df['나이']에 s값을 넣는다
#(1) 과 (3) 만 하면 숫자 index가 아닌 지정한 문자 index라 error
# 즉 index기반으로 data를 mapping해야한다

# Series를 이용하면 모든 데이터를 다 넣지 않고도 column을 추가할 수 있어요!.
# 단 index가 matching되어야 해요!
s = pd.Series([20,25,29],
index=['one','four', 'five'])
df['나이'] = s
display(df)

# 7. column을 추가하거나 column을 값을 수정할 때 연산을 통해서 할 수 있어요!
# df['평점'] = df['평점'] * 1.1 # 모든사람의 평점을 10%씩 올리는 경우
# display(df)
df['장학여부'] = df['평점'] > 4.0
display(df)

# 8. 원하는 column을 삭제하려면 어떻게 해야 하나요?
new_df = df.drop('등급', axis=1, inplace=False)
# (뭘 삭제할지, 값이 같을때 colum인지 index인지 몰르기땜에 axis, )
#inplace=False 는 원본은 보존하고 복사본을 변수에 / true면 원본 삭제
display(new_df)

row(record, 행)에 대한 crud
# 위쪽에 있는 내용이 DataFrame의 column을 제어하는 내용이예요! (CRUD)
# DataFrame의 행에 대해서 추가를 해보아요!
import numpy as np
import pandas as pd
data = {'이름': ['아이유', '김연아', '홍길동', '장범준', '이순신'],
'학과': ['철학과', '수학과', '물리학과', '경영학과', '컴퓨터'],
'평점': [1.5, 2.0, 3.4, 2.9, 4.9],
'학년': [1, 3, 2, 1, 4]}
df = pd.DataFrame(data,
columns=['학과', '이름', '학년', '평점', '등급'],
index=['one', 'two', 'three', 'four', 'five'])
# display(df)

df.loc['six',:] = ['미술', '신사임당', 2, 3.4, 'A']
display(df)

# df.loc['six',['학과', '이름']] = ['미술', '신사임당']
# display(df)

row 값 변경
# df.loc['one','평점'] = 4.8
# display(df)

row 삭제
new_df = df.drop('three', axis=0, inplace=False)
display(new_df)

new_df = df.drop( 2, axis=0, inplace=False) # 숫자indexing 로는 삭제가 안되요!
new_df = df.drop('three':'four', axis=0, inplace=False) # slicing으로는 삭제가 안되요!
new_df = df.drop(['three','four'], axis=0, inplace=False) # fancy indexing으로는 삭제가 되요!
- data를 유실시키기때문에 웬만하면 거의 사용하지 않는다
ㅋ
row(record, 행)에 대한 indexing, slicing
# import numpy as np
import pandas as pd
data = {'이름': ['아이유','김연아','홍길동','강감찬','이순신'],
'학과': ['수학과','기계','철학과','경영학과','철학'],
'학년': [1, 4, 2, 3, 2],
'평점': [1.5, 3.8, 2.9, 4.3, 4.4]}
df = pd.DataFrame(data,
columns=['학과','이름','학년','평점','등급'],
index=['one','two','three','four', 'five'])
display(df)

# column indexing
# df['이름'] # OK! Series가 return
# df['이름':'평점'] # Error! column에 대한 slicing은 안되요!
# df[['이름','학년','평점']] # OK! Fancy indexing은 가능해요!~
# column은 boolean indexing이 안된다
# row indexing(index 숫자를 이용해 보아요!)
# df[1] # Error! index 숫자를 이용한 단일 indexing이 안되요!
# df[1:3] # OK! index 숫자를 이용한 slicing은 가능해요! -> view로 떨어지고 DataFrame
# df[2:] # OK!
# df[[1,3]] # Error! index 숫자를 이용한 fancy indexing이 안되요!
# row indexing(지정한 index를 이용해 보아요!)
# df['two'] # Error! 지정 index를 이용한 단일 indexing이 안되요!!(단일 row추출이 안되요!)
# df['two':'four'] # OK!
# df['two':] # OK!
# df['two':-1] # Error! 숫자 index와 지정 index를 혼용해서 사용할 수 없어요!
# df[['one', 'three']] # Error!
# row indexing은 이렇게 하는게 좋아요! ( loc + 지정 index )

series로 나오며 colum명이 index명 (data type도 틀리고 세로줄도 아니라)
# df.loc['two'] # OK! loc와 지정 index를 이용하면 단일 row를 추출할 수 있어요!
# df.loc['two':'four'] # OK! row slicing이 가능
# df.loc['two':] # OK!
# df.loc['two':-1] # Error! 지정 index와 숫자 index는 무조건 같이 사용할 수 없어요!
# df.loc[['two', 'four']] # OK! fancy indexing도 가능하네요!!
# print(df.loc[1]) # Error! loc는 숫자 index를 사용할 수 없어요!
# 숫자 index를 사용하려면 iloc를 사용하면 되요!
- iloc는 무조건 숫자만 가능하다
# print(df.iloc[1]) # OK! 단일 행 선택가능!
# display(df.iloc[1:3]) # OK! slicing도 가능해요!
# display(df.iloc[1:4,:2]) # OK!
# display(df.iloc[[1,3],[1,3]]) - numpy에서는 2개의 fancy indexing이 안되 ix_ 를 이용했지만 pd는 가능

import pandas as pd
data = {'이름': ['아이유','김연아','홍길동','강감찬','이순신'],
'학과': ['수학과','기계','철학과','경영학과','철학'],
'학년': [1, 4, 2, 3, 2],
'평점': [1.5, 3.8, 2.9, 4.3, 4.4]}
df = pd.DataFrame(data,
columns=['학과','이름','학년','평점','등급'],
index=['one','two','three','four', 'five'])
display(df)

# df.loc['two':'four','학과'] # OK! Series로 리턴되요! (colum이 1개라)
# df.loc['two':'four','학과':'학년'] # OK! loc를 이용하면 column에 대해서도 slicing이 가능해요!
# df.loc['two':'four',['이름','평점']] # OK! loc를 이용하면 column에 대해서 fancy indexing이 가능해요!
# 학점이 4.0을 초과하는 학생의 이름과 평점을 DataFrame으로 출력하세요!
# display(df.loc[df['평점'] > 4,['이름', '평점']])
# 이름이 아이유인 사람을 찾아서 이름과 학과를 DataFrame으로 출력하세요!
# display(df.loc[df['이름']=='아이유', ['이름','학과']])
# 평점이 3.0을 초과하는 사람을 찾아 등급을 'A'로 설정하세요!
# df.loc[df['평점'] > 3.0, '등급'] = 'A'
# display(df)
# 평점이 1.5 이상 3.0 미만인 사람을 찾아 학과 이름 평점을 출력하세요!
# df.loc[(df['평점'] >= 1.5) & (df['평점'] < 3.0) , ['학과', '이름', '평점']]
'python > pandas, numpy' 카테고리의 다른 글
pandas merge (feat. join) (0) | 2021.08.23 |
---|---|
pandas 공분산, 정렬 (0) | 2021.08.21 |
dataframe으로 json이용 (0) | 2021.08.19 |
pandas 기초 (0) | 2021.08.19 |
numpy 3일차 (0) | 2021.08.18 |