pandas 인덱스 와 컬럼(index & colum)

2021. 8. 20. 01:15python/pandas, numpy

728x90

# 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