코딩하는 타코야끼

[Pandas] 2-2강_Pandas DataFrame(행, 열의 값 조회 및 변경) 본문

[T.I.L] : Today I Learned/Pandas

[Pandas] 2-2강_Pandas DataFrame(행, 열의 값 조회 및 변경)

가스오부시 2023. 4. 13. 03:04
728x90
반응형

1. 컬럼이름 / 행이름 조회 및 변경


📍 컬럼이름 / 행이름 조회

🌓  DataFrame객체.columns

  • 컬럼명 조회
  • 컬럼명은 차후 조회를 위해 따로 변수에 저장하는 것이 좋다.
movie.columns

🌓  DataFrame객체.index

  • 행명 조회
movie.index


📍 컬럼이름 / 행이름 변경

  • columns와 index 속성으로는 통째로 바꾸는 것은 가능하나 일부만 선택해서 변경하는 것은 안된다.
    •  df.columns = ['새이름','새이름', ... , '새이름'] 
    •  df.columns[1] = '새이름' 
      • 이런식으로 개별적으로 변경은 안된다.
grade = pd.read_csv('saved_data/grade2.csv')
grade.columns

🌓  컬럼 원본 변경

grade.columns = ['ID', '국어', '영어']  # dataframe원본이 바뀜.
grade

🌓  개별 컬럼 변경 불가

🌓  컬럼이름 / 행이름 변경 관련 메소드

  •  DataFrame객체.rename(index=행이름변경설정, columns=열이름변경설정, inplace=False) 
    • 개별 컬럼이름/행이름 변경 하는 메소드
    • 변경한 DataFrame을 반환
    • 변경설정: 딕셔너리 사용
      • {'기존이름':'새이름', ..}
      • inplace: 원본을 변경할지 여부(boolean)
    # 국어->KOREAN, 영어->ENGLISH
    new_columns = {
        "국어":"KOREAN", 
        "영어":"ENGLISH"
    }
    new_index = {
        0:'영',
        1:'일',
        2:'이',
        3:'삼',
        4:'사'
    }
    grade.rename(columns=new_columns, index=new_index, inplace=True)
    grade
    

  •  DataFrame객체.set_index(컬럼이름, inplace=False)  
    • 특정 컬럼을 행의 index 명으로 사용
    • 열이 index명이 되면서 그 컬럼은 Data Set 에서 제거된다.
    # ID 컬럼을\\ 행 식별자(index name)으로 지정.
    grade.set_index('ID', inplace= True)
    grade
    
     

  •  DataFrame객체.reset_index(inplace=False) 
    • index를 첫번째 컬럼으로 복원
grade.reset_index('ID', inplace = True)
# index명 생략 가능
# grade.resrt_index(inplace = True)
grade


2. 행과 열의 값 변경


📍 특정 행 또는 열 삭제

🌓  DataFrame객체.drop(columns, index, inplace=False)

  • columns : 삭제할 열이름 또는 열이름 리스트
  • index : 삭제할 index명 또는 index 리스트
  • inplace: 원본을 변경할지 여부(boolean)

🌓  컬럼(열) 삭제

grade.drop(columns='KOREAN')              # 1
grade.drop(columns=['KOREAN', 'ENGLISH']) # 2 - fancy
grade.drop(labels=['KOREAN', 'ENGLISH'], axis=1) # 3

🌓  index(행) 삭제

grade.drop(index = 2)
grade.drop(index = [0, 2, 4])
grade.drop(labels = [0, 2, 4], axis = 0)


📍 열 추가

  • 새로운 열을 지정 후 값을 대입하면 새로운 열을 추가할 수 있다.
    • 보통 파생변수를 만들 때 사용한다.

🌓  열 추가

  •  df['새열명'] = 값 
  • 마지막 열로 추가된다.
  • 하나의 값을 대입하면 모든 행에 그 값이 대입된다.
  • 다른 값을 주려면 배열에 담아서 대입한다.
# 컬럼값 조회
# 컬럼값 변경 df['컬럼명'] = 값  (없는 컬럼: 추가, 있는 컬럼: 변경)
grade['MATH'] = 90
grade['PYTHON'] = [100, 90, 70, 80, 100]
grade

🌓  열 삽입

  •  df.insert(삽입할 위치 index, 삽입할 열이름, 값) 
total = grade["KOREAN"] + grade["ENGLISH"] + grade["MATH"] + grade["PYTHON"]
grade.insert(3, "총점", total)
grade

🌓  파생변수생성

  • 기존 열들의 값을 이용해서 만든 열을 파생변수라고 한다.
  • 벡터화 연산을 이용하여 값 대입한다.
  • df['새열이름'] = 기존 열들을 이용한 연산

3. 행, 열의 값 조회

  • indexer 연산자를 이용한다.
    • 행은 loc indexer, iloc indexer를 사용한다.
  • 열은 indexing만 되고 slicing은 안된다.
  • 행은 indexing, slicing 모두 지원한다.

📍 열의 값 조회

🌓  df['열이름']

  • 열이름의 열 조회

🌓  df.열이름

  • 열이름이 Python 식별자 규칙에 맞으면 . 표기법을 사용할 수 있다.

🌓  Fancy indexing

  • 여러개의 열들을 한번에 조회할 경우 열이름들을 리스트로 묶어서 전달한다.

🌓  주의

  • 열은 순번으로는 조회할 수 없다.
  • 열 조회 indexer에서 슬라이싱을 하면 행 조회 Slicing이다.
    • 만약 indexing이나 slicing을 이용해 열들을 조회하려면 columns 속성을 이용한다.
      •  df[df.columns[:3]] 
# 여러 컬럼 조회할때는 리스트로 묶어서 전달. -> fancy indexing
g2[['KOREAN', 'MATH']]

# 컬럼 순번으로 조회하려면 columns 를 이용.
col = g2.columns
g2[col[1:4]]


📍 다양한 열선택 기능을 제공하는 메소드들

🌓   select_dtypes(include=[데이터타입,..], exclude=[데이터타입,..]) 

  • 전달한 데이터 타입의 열들을 조회.
  • include : 조회할 열 데이터 타입
  • exclude : 제외하고 조회할 열 데이터 타입

🌓   filter (items=[], like='', regex='') 

  • 매개변수에 전달하는 열의 이름에 따라 조회
  • 각 매개변수중 하나만 사용할 수 있다.
  • items = [컬럼명들, ..]
    • 리스트와 일치하는 열들 조회
    • 이름이 일치 하지 않아도 Error 발생안함.
  • like = '부분일치문자열'
    • 전달한 문자열이 들어간 열들 조회
    • 부분일치 개념
  • regex = '정규표현식'
    • 정규 표현식을 이용해 열명의 패턴으로 조회
g.info()
>>>
<class 'pandas.core.frame.DataFrame'>
Index: 5 entries, id-1 to id-5
Data columns (total 6 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   KOREAN   5 non-null      int64  
 1   ENGLISH  5 non-null      int64  
 2   MATH     5 non-null      int64  
 3   PYTHON   5 non-null      int64  
 4   총점       5 non-null      int64  
 5   평균       5 non-null      float64
dtypes: float64(1), int64(5)
memory usage: 280.0+ bytes
# 조회하려는 타입을 지정.
g.select_dtypes(include='float64')

🌓  행 조회

  • loc : index 이름으로 조회
  • iloc : 행 순번으로 조회

loc indexer

  • index name으로 조회
  •  DF.loc[ index이름 ] 
    • 한 행 조회.
    • 조회할 행 index 이름(레이블) 전달
    • 이름이 문자열이면 " " 문자열표기법으로 전달. 정수이며 정수표기법으로 전달한다.
  •  DF.loc[ index이름 리스트 ] 
    • 여러 행 조회.
    • 팬시 인덱스
    • 조회할 행 index 이름(레이블) 리스트 전달
  •  DF.loc[start index이름 : end index이름: step] 
    • 슬라이싱 지원
    • end index 이름의 행까지 포함한다.
  •  DF.loc[index이름 , 컬럼이름] 
    • 행과 열 조회
    • 둘다 이름으로 지정해야 함.
# 행조회는 slicing 지원
g2.loc['id-2':'id-5']  #  stop index도 포함
g2.loc['id-2':'id-5':2]
g2.loc['id-2':]  # stop 생략 => 마지막 행까지 다 조회
g2.loc[:'id-3']  # start 생략=> 시작 행(0번 행) 부터 조회

g2.loc['id-2', 'KOREAN']
>>>
50

iloc

  • index(행 순번)으로 조회
  •  DF.iloc[행번호] 
    • 한 행 조회.
    • 조회할 행 번호 전달
  •  DF.iloc[ 행번호 리스트 ] 
    • 여러 행 조회.
    • 조회할 행 번호 리스트 전달
  •  DF.iloc[start 행번호: stop 행번호: step] 
    • 슬라이싱 지원
    • stop 행번호 포함 안함.
  •  DF.iloc[행번호 , 열번호] 
    • 행과 열 조회
    • 행열 모두 순번으로 지정
# fancy indexing : list로 묶어서 전달
g2.iloc[[2,1,4]]

g.iloc[[1,3], [2, 5]]

g.iloc[[0, 3], : 4]


📍 Boolean indexing을 이용한 조회

  • 원하는 조건을 만족하는 행, 열을 조회한다.
  •  DataFrame객체[조건], DataFrame객체.loc[조건] 
    • 조건이 True인 행만 조회
    • 열까지 선택시
      •  DataFrame객체[조건][열] 
      •  DataFrame객체.loc[조건, 열] 
  • iloc indexer는 boolean indexing을 지원하지 않는다.
  • 논리연산자

  • 논리연산자의 피연산자들은 반드시 ( )로 묶어준다
  • 파이썬과는 다르게 and, or, not 예약어는 사용할 수 없다.
# 국어가 60 ~ 80 사이이고 영어가 100점인 행들의 국어, 영어, 평균점수를 확인
g2[g2['KOREAN'].between(60, 80)  &  (g2['ENGLISH'] == 100)][['KOREAN', 'ENGLISH', '평균']]

# df.loc[행->boolean index, 열]
g2.loc[g2['KOREAN'].between(60, 80)  &  (g2['ENGLISH'] == 100),    ['KOREAN', 'ENGLISH', '평균']]


📍 query() 를 이용한 boolean indexing

🌓  query(조회조건)

  • sql의 where 절의 조건 처럼 문자열의 query statement를 이용해 조건으로 조회
  • boolean index에 비해
    • 장점: 편의성(문자열로 query statement를 만들므로 동적 구문 생성등 다양한 처리가 가능)과 가독성이 좋다.
    • 단점: 속도가 느리다.

🌓  조회조건 구문

  •  "컬럼명 연산자 비교값" 

🌓  외부변수를 이용해 query문의 비교값을 지정할 수 있다.

  • query 문자열 안에서 @변수명 사용
  • f string이나 format() 함수를 이용해 query를 만들 수도 있다.

🌓  query 함수 연산자

  • 비교 연산자
    • ==, >, >=, <, <=, !=
    import pandas as pd
    import numpy as np
    data_dict = {
        'name':['김영수', '박영희', '오준호', '조민경', '박영희', '김영수'],
        'age':[23, 17, 28, 31, 23, 17],
        'email':['kys@gmail.com', 'pyh@gmail.com', 'ojh@daum.net', 'cmk@naver.com', 'pyh@daum.net', np.nan]}
    df = pd.DataFrame(data_dict)
    df
    

# 비교연산
# 나이가 17세인 사람
# df[df['age'] == 17]
df.query("age == 17")  #조회대상데이터프레임.query("컬럼명 == 비교값")
df.query("age > 25")
df.query("age != 17")

  • 결측치 비교
    • 컬럼.isna(), isnull()
    • 컬럼.notna(), notnull()
    #결측치가 있는 행
    df.query("email.isna()")  # 대상컬럼.isnull(), isna()
    df.query("email.isnull()")
    

  • 논리 연산자
    • and, or, not
    # 논리연산 -> and, or, not 을 사용가능.  (&, |, ~ 사용가능.)
    df.query('not age < 25')
    df.query('~ (age < 25)')
    

  • in 연산자
    • in, ==
    • not in, !=
    • 비교 대상값은 리스트에 넣는다.
    # 나이가 17과 23이 아닌 행을 조회
    df.query('age!=17 and age!=23')  # 동일한 컬럼으로 여러개의 값과 != 비교.
    df.query('age != [17, 23]')
    df.query('age not in [17, 23, 30, 40, 50]')
    

  • Index name으로 검색
    • 행의 index 이름으로 검색
    df.query('index in [1,3,4]')
    

  • 문자열 부분검색(sql의 like)
    • 컬럼명.str.contains(문자열): 문자열을 포함하고 있는
    • 컬럼명.str.startswith(문자열): 문자열로 시작하는
    • 컬럼명.str.endswith(문자열): 문자열로 끝나는
    • 문자열 부분검색을 할 컬럼에 결측치(NaN)이 있으면 안된다.
    # name컬럼의 값들 중 "영희"를 포함한 행.
    df.query('name.str.contains("영희")')
    

# email이 결측치가 아닌행을 조회 -> 2. 조건을 조회
df.query('email.notnull()').query('email.str.endswith("com")')   # (메소드, 함수) chaining

반응형