29 분 소요

DataFrame(데이터프레임)

DataFrame 개요

  • 표(table-행렬) 를 다루는 Pandas의 타입.
    • Database의 Table이나 Excel의 표와 동일한 역할을 한다.
  • 분석할 데이터를 가지는 판다스의 가장 핵심적인 클래스이다.
  • 행(row)와 열(column) 으로 구성되 있다.
  • 각 행과 각 열은 식별자를 가지며 Series와 같이 두가지 종류가 있다.

    • 순번
      • 양수, 음수 index 두가지를 가진다.
      • 컬럼도 내부적으로는 순번으고 관리되지만 우리가 조회할 때 사용할 수는 없다.
    • 이름
      • 명시적으로 지정한 행과 열의 이름을 말한다.
      • 행의 이름은 index name 이라고 하고 열의 이름은 column name이라고 한다.
      • index name과 column name은 중복될 수 있다.
      • 명시적으로 지정하지 않으면 양수 순번이 index, column 이름으로 설정된다.
  • 하나의 행과 하나의 열은 Series로 구성된다.
  • DataFrame 객체는 직접 데이터를 넣어 생성하거나 데이터 셋을 파일(csv, 엑셀, DB 등)로 부터 읽어와 생성한다.

DataFrame 생성

직접 생성

  • pd.DataFrame(data [, index=None, columns=None])
    • data
      • DataFrame을 구성할 값을 설정
        • Series, List, ndarray를 담은 2차원 배열
        • 열이름을 key로 컬럼의 값 value로 하는 딕션어리(사전)
    • index
      • index명으로 사용할 값 배열로 설정
    • columns
      • 컬럼명으로 사용할 값 배열로 설정
import os
import numpy as np
import pandas as pd 
# 딕셔너리를 이용해 생성.
# key: 컬럼명, value: 그 컬럼의 값들을 1 차원 자료구조로 설정.
# value의 리스트의 크기는 같아야 한다.
dic = {
    'id':['id-1', 'id-2', 'id-3', 'id-4', 'id-5'],
    'korean':[100,50,70,60,90],
    'english':[90,80,100,60,40]
    
}
grade = pd.DataFrame(dic)
print(grade)
grade # jupyter notebook 에서는 그냥 grade로 뽑는다.
     id  korean  english
0  id-1     100       90
1  id-2      50       80
2  id-3      70      100
3  id-4      60       60
4  id-5      90       40
id korean english
0 id-1 100 90
1 id-2 50 80
2 id-3 70 100
3 id-4 60 60
4 id-5 90 40
# 2차원 자료구조를 이용해서 생성
np.random.seed(0) # num파일 내 파일 
data = np.random.randint(10, size=(5,3))  # 0 ~ 10-1 사이의 난수로 5행 3열의 행렬을 생성!!
# data_df = pd.DataFrame(data)
data_df = pd.DataFrame(data, columns=['AA', 'BB', 'CC'], 
                       index=['가', '나', '다', '라', '마'])  # 주의사항! colum과 index 설정시 행과 열의 개수를 일치하게 입력한다.
data_df
AA BB CC
5 0 3
3 7 9
3 5 2
4 7 6
8 8 1

DataFrame의 객체를 파일에 저장

  • DataFrame객체는 다양한 형식의 파일로 저장할 수 있다.
  • 기본구문
    • DataFrame객체.to_파일타입()

CSV 파일로 저장

  • DataFrame객체.to_csv(파일경로,sep=',', index=True, header=True, encoding)
    • 텍스트 파일로 저장
    • 파일경로: 저장할 파일경로(경로/파일명)
    • sep : 데이터 구분자
    • index, header: 인덱스/헤더 저장 여부
    • encoding: 기본- UTF-8
  • 만약 index를 True로 도출하면 0,1,2,3,4,…로 저장이 되기 때문에 보통 index=False로 한다.
  • header는 columns 이다.
import os
os.getcwd()
'/Users/seokminlee/Desktop/mose/pandas_template/02_Pandas_DataFrame'
import os
# dataframe을 저장할 디렉토리 생성
os.makedirs('saved_data', exist_ok=True)
grade.to_csv('saved_data/grade1.csv')
grade.to_csv('saved_data/grade2.csv', index = False) # index이름은 저장안함.
grade.to_csv('saved_data/grade3.csv', index = False, header = False) # index/column 이름 저장안함.
grade.to_csv('saved_data/grade5.csv', sep='\t', index = False)  #값 구분자로 tab 사용.

엑셀로 저장

  • DataFrame객체.to_excel(파일경로, index=True, header=True)
grade.to_excel('saved_data/grade1.xlsx', index = False)
  • “!명령어” 는 터미널 명령어를 사용할때 사용한다.
# 엑셀 xls 확장자 쓰고 읽을떄 사용하는 모듈
!pip install xlwt xlrd
Requirement already satisfied: xlwt in /Users/seokminlee/opt/anaconda3/envs/ml/lib/python3.9/site-packages (1.3.0)
Requirement already satisfied: xlrd in /Users/seokminlee/opt/anaconda3/envs/ml/lib/python3.9/site-packages (2.0.1)
# 엑셀 xlsx 확장자 쓰고 읽을떄 사용하는 모듈
!pip install openpyxl
Requirement already satisfied: openpyxl in /Users/seokminlee/opt/anaconda3/envs/ml/lib/python3.9/site-packages (3.0.10)
Requirement already satisfied: et-xmlfile in /Users/seokminlee/opt/anaconda3/envs/ml/lib/python3.9/site-packages (from openpyxl) (1.1.0)

기타 형식

# pickle => binaru(bytes) 로 저장.
grade.to_pickle('saved_data/grade.pk1')
# html의 테이블로 저장
grade.to_html('saved_data/grade.html', index=False)

파일로 부터 데이터셋을 읽어와 생성하기

csv 파일 등 텍스트 파일로 부터 읽어와 생성

  • pd.read_csv(파일경로, sep=',', header, index_col, na_values, encoding)
    • 파일경로
      • 읽어올 파일의 경로
    • sep=”,”
      • 데이터 구분자.
      • 기본값: 쉼표
    • header=정수
      • 열이름(컬럼이름)으로 사용할 행 지정
      • 기본값: 첫번째 행
      • None을 설정하면 Header는 없다는 것으로 파일의 첫번째 행부터 값으로 사용하고 컬럼명은 0부터 자동증가하는 값을 붙인다.
    • index_col=정수,컬럼명
      • index 명으로 사용할 열이름(문자열)이나 열의 순번(정수)을 지정.
      • 생략시 0부터 자동증가하는 값을 붙인다.
    • na_values
      • 읽어올 데이터셋의 값 중 결측치로 처리할 문자열 지정.
#grade1.csv (index, header 모두 저장된 파일)
grade1 = pd.read_csv('saved_data/grade1.csv') 
grade1
Unnamed: 0 id korean english
0 0 id-1 100 90
1 1 id-2 50 80
2 2 id-3 70 100
3 3 id-4 60 60
4 4 id-5 90 40
grade1_2 = pd.read_csv('saved_data/grade1.csv',index_col=0) # 0번째에 있는 column을 index로 보낸 표
grade1_2
id korean english
0 id-1 100 90
1 id-2 50 80
2 id-3 70 100
3 id-4 60 60
4 id-5 90 40
# index가 없이 저장한 csv파일
grade3= pd.read_csv('saved_data/grade2.csv',header = None,
                    names = ['아이디','국어','영어'])
grade3
아이디 국어 영어
0 id korean english
1 id-1 100 90
2 id-2 50 80
3 id-3 70 100
4 id-4 60 60
5 id-5 90 40
#index 명, column명 둘다 저장이 안된 파일
grade3 = pd.read_csv('saved_data/grade3.csv', header=None)
grade3
0 1 2
0 id-1 100 90
1 id-2 50 80
2 id-3 70 100
3 id-4 60 60
4 id-5 90 40
# sep = '\t' 로 저장한 파일
grade5 = pd.read_csv('saved_data/grade5.csv', sep='\t') # defaul 구분자:,
grade5
id korean english
0 id-1 100 90
1 id-2 50 80
2 id-3 70 100
3 id-4 60 60
4 id-5 90 40
# 결측지가 저장된 파일
grade_na = pd.read_csv('saved_data/grade_na.csv', na_values='?') # '?'를 결측지로 바꾸는 명령어 ""na_values = '?' "
grade_na
id korean english
0 id-1 100.0 90.0
1 id-2 50.0 NaN
2 id-3 NaN 100.0
3 id-4 60.0 60.0
4 id-5 90.0 40.0
pd.read_csv?
na_values : scalar, str, list-like, or dict, optional
    Additional strings to recognize as NA/NaN. If dict passed, specific
    per-column NA values.  By default the following values are interpreted as
    NaN: '', '#N/A', '#N/A N/A', '#NA', '-1.#IND', '-1.#QNAN', '-NaN', '-nan',
    '1.#IND', '1.#QNAN', '<NA>', 'N/A', 'NA', 'NULL', 'NaN', 'n/a',
    'nan', 'null'.
grade_na.isnull()
id korean english
0 False False False
1 False False False
2 False False False
3 False False False
4 False False False

엑셀파일 읽기

grade_xlsx = pd.read_excel('saved_data/grade1.xlsx',index_col = 0)
grade_xlsx
id korean english
0 id-1 100 90
1 id-2 50 80
2 id-3 70 100
3 id-4 60 60
4 id-5 90 40
grade_xls = pd.read_excel('saved_data/grade2.xls')
grade_xls
id korean english
0 id-1 100 90
1 id-2 50 80
2 id-3 70 100
3 id-4 60 60
4 id-5 90 40

기타

grade_pk1 = pd.read_pickle('saved_data/grade.pk1')
grade_pk1
id korean english
0 id-1 100 90
1 id-2 50 80
2 id-3 70 100
3 id-4 60 60
4 id-5 90 40
grade_html = pd.read_html('saved_data/grade.html')
type(grade_html) # html 파일안에 있는 모든 table들을 읽어서 list로 반환.
grade_html[0]
id korean english
0 id-1 100 90
1 id-2 50 80
2 id-3 70 100
3 id-4 60 60
4 id-5 90 40
url = 'https://ko.wikipedia.org/wiki/FIFA_%EC%9B%94%EB%93%9C%EC%BB%B5'
world_cup = pd.read_html(url)
print(len(world_cup))
world_cup[1]
12
대륙별 지역 출전국 수 본선 진출국 수 본선 진출율
0 아프리카(CAF) 55 5 9%
1 아시아(AFC) 46 4.5 1 9.7%
2 오세아니아(OFC) 16 0.5 1 3%
3 유럽(UEFA) 53 13 24%
4 북중미카리브(CONCACAF) 40 3.5 1 8.7%
5 남아메리카(CONMEBOL) 10 4.5 1 45%
6 개최국(대륙을 불문하고 선정됨.) 1 1 100%
7 총합 220 32 14.5%

주요 메소드, 속성

main_method_df1

main_method_df2

데이터 프레임의 기본 정보 조회

  • csv 파일 읽기
  • shape
  • info()
  • head()
  • tail()
  • isnull().sum()
    • 컬럼별 null 체크 (sum() 한번 더 하면 총개수)
  • describe() : 숫자형-기술통계값, 범주형-총개수, 고유값들, 최빈값
os.getcwd()
os.chdir('/Users/seokminlee/Desktop/mose/pandas_template') # + 현재 working directory 확인 후 경로 변경
import pandas as pd

# csv 파일을 읽어서 DataFrame 생성
df = pd.read_csv('data/movie.csv')
df.shape # 튜플 (행수, 열수) => DataFrame의 행/열의 개수
# (4916, 28) # 영화 4916편 정보, 각 영화는 28개의 속성
(4916, 28)
# dataframe.head([행수]), tail([행수]) : 앞/뒤에 지정한 행수만큼만 확인, default: 5행
# 데이터셋의 값들의 (열별) 구성을 확인. 컬럼값들이 어떻게 구성되있는지를 데이터 딕셔너리와 비교해서 확인.
# 참고: 데이터 딕셔너리-데이터셋에 대한 설명서
df.head() # 행기준 앞 5행
color director_name num_critic_for_reviews duration director_facebook_likes actor_3_facebook_likes actor_2_name actor_1_facebook_likes gross genres ... num_user_for_reviews language country content_rating budget title_year actor_2_facebook_likes imdb_score aspect_ratio movie_facebook_likes
0 Color James Cameron 723.0 178.0 0.0 855.0 Joel David Moore 1000.0 760505847.0 Action|Adventure|Fantasy|Sci-Fi ... 3054.0 English USA PG-13 237000000.0 2009.0 936.0 7.9 1.78 33000
1 Color Gore Verbinski 302.0 169.0 563.0 1000.0 Orlando Bloom 40000.0 309404152.0 Action|Adventure|Fantasy ... 1238.0 English USA PG-13 300000000.0 2007.0 5000.0 7.1 2.35 0
2 Color Sam Mendes 602.0 148.0 0.0 161.0 Rory Kinnear 11000.0 200074175.0 Action|Adventure|Thriller ... 994.0 English UK PG-13 245000000.0 2015.0 393.0 6.8 2.35 85000
3 Color Christopher Nolan 813.0 164.0 22000.0 23000.0 Christian Bale 27000.0 448130642.0 Action|Thriller ... 2701.0 English USA PG-13 250000000.0 2012.0 23000.0 8.5 2.35 164000
4 NaN Doug Walker NaN NaN 131.0 NaN Rob Walker 131.0 NaN Documentary ... NaN NaN NaN NaN NaN NaN 12.0 7.1 NaN 0

5 rows × 28 columns

df.tail() # 행기준 뒤 5행
color director_name num_critic_for_reviews duration director_facebook_likes actor_3_facebook_likes actor_2_name actor_1_facebook_likes gross genres ... num_user_for_reviews language country content_rating budget title_year actor_2_facebook_likes imdb_score aspect_ratio movie_facebook_likes
4911 Color Scott Smith 1.0 87.0 2.0 318.0 Daphne Zuniga 637.0 NaN Comedy|Drama ... 6.0 English Canada NaN NaN 2013.0 470.0 7.7 NaN 84
4912 Color NaN 43.0 43.0 NaN 319.0 Valorie Curry 841.0 NaN Crime|Drama|Mystery|Thriller ... 359.0 English USA TV-14 NaN NaN 593.0 7.5 16.00 32000
4913 Color Benjamin Roberds 13.0 76.0 0.0 0.0 Maxwell Moody 0.0 NaN Drama|Horror|Thriller ... 3.0 English USA NaN 1400.0 2013.0 0.0 6.3 NaN 16
4914 Color Daniel Hsia 14.0 100.0 0.0 489.0 Daniel Henney 946.0 10443.0 Comedy|Drama|Romance ... 9.0 English USA PG-13 NaN 2012.0 719.0 6.3 2.35 660
4915 Color Jon Gunn 43.0 90.0 16.0 16.0 Brian Herzlinger 86.0 85222.0 Documentary ... 84.0 English USA PG 1100.0 2004.0 23.0 6.6 1.85 456

5 rows × 28 columns

# DataFrame 자체의 정보 => 행/열
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4916 entries, 0 to 4915
Data columns (total 28 columns):
 #   Column                     Non-Null Count  Dtype  
---  ------                     --------------  -----  
 0   color                      4897 non-null   object 
 1   director_name              4814 non-null   object 
 2   num_critic_for_reviews     4867 non-null   float64
 3   duration                   4901 non-null   float64
 4   director_facebook_likes    4814 non-null   float64
 5   actor_3_facebook_likes     4893 non-null   float64
 6   actor_2_name               4903 non-null   object 
 7   actor_1_facebook_likes     4909 non-null   float64
 8   gross                      4054 non-null   float64
 9   genres                     4916 non-null   object 
 10  actor_1_name               4909 non-null   object 
 11  movie_title                4916 non-null   object 
 12  num_voted_users            4916 non-null   int64  
 13  cast_total_facebook_likes  4916 non-null   int64  
 14  actor_3_name               4893 non-null   object 
 15  facenumber_in_poster       4903 non-null   float64
 16  plot_keywords              4764 non-null   object 
 17  movie_imdb_link            4916 non-null   object 
 18  num_user_for_reviews       4895 non-null   float64
 19  language                   4904 non-null   object 
 20  country                    4911 non-null   object 
 21  content_rating             4616 non-null   object 
 22  budget                     4432 non-null   float64
 23  title_year                 4810 non-null   float64
 24  actor_2_facebook_likes     4903 non-null   float64
 25  imdb_score                 4916 non-null   float64
 26  aspect_ratio               4590 non-null   float64
 27  movie_facebook_likes       4916 non-null   int64  
dtypes: float64(13), int64(3), object(12)
memory usage: 1.1+ MB

DataFrame 정보 읽는법.


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4916 entries, 0 to 4915   ==================> 행 정보, 행수, index dlfma
Data columns (total 28 columns):      ==================> 열 정보 
# Column                     Non-Null Count  Dtype =====> 개별 컬럼 정보: 컬롬이름, 결측치제외한 데이터개수, 타입
---  ------                     --------------  -----  
 0   color                      4897 non-null   object 
 1   director_name              4814 non-null   object 
 2   num_critic_for_reviews     4867 non-null   float64
 3   duration                   4901 non-null   float64
 4   director_facebook_likes    4814 non-null   float64
 5   actor_3_facebook_likes     4893 non-null   float64
 6   actor_2_name               4903 non-null   object 
 7   actor_1_facebook_likes     4909 non-null   float64
 8   gross                      4054 non-null   float64
 9   genres                     4916 non-null   object 
---  ------                     --------------  ----- 
 26  aspect_ratio               4590 non-null   float64
 27  movie_facebook_likes       4916 non-null   int64  
dtypes: float64(13), int64(3), object(12)    ===============> 데이터 타입별 컬럼개수.
memory usage: 1.1+ MB                        ===============> 메모리 크기.
  • object: 문자열
  • 컴럼별로
    1. 결측치 있는 지 여부
    2. 데이터 타입, 크기 확인 – 금액인데 oject로 있는경우 들 확인필요.
      • 데이터 딕셔너리와 비교해서 잘못된 데이터 타입은 없는지 확인.
      • 컬럼이 가지는 값에 비해 너무 큰 크기로 잡힌 것은 아닌지 확인.
# 결측치 개수를 확인 => 컬럼별.
# df.isnull() #원소별로 결측치인지 여부 확인: True- 결측치, False: 일반값

# df.isnull().sum() 
# 1. bool 값들을 sum()- 덧셈 : True - 1, False - 0 ==> True가 몇개?
# 2. DataFrame객체.sum() - 컬럼단위로 계산.
df.isna().sum()
color                         19
director_name                102
num_critic_for_reviews        49
duration                      15
director_facebook_likes      102
actor_3_facebook_likes        23
actor_2_name                  13
actor_1_facebook_likes         7
gross                        862
genres                         0
actor_1_name                   7
movie_title                    0
num_voted_users                0
cast_total_facebook_likes      0
actor_3_name                  23
facenumber_in_poster          13
plot_keywords                152
movie_imdb_link                0
num_user_for_reviews          21
language                      12
country                        5
content_rating               300
budget                       484
title_year                   106
actor_2_facebook_likes        13
imdb_score                     0
aspect_ratio                 326
movie_facebook_likes           0
dtype: int64
df.describe()
# 1. 컬럼단위로 통계치를 묶어서 보여준다.
# 2. 수치형 컬럼들만 보여준다.
num_critic_for_reviews duration director_facebook_likes actor_3_facebook_likes actor_1_facebook_likes gross num_voted_users cast_total_facebook_likes facenumber_in_poster num_user_for_reviews budget title_year actor_2_facebook_likes imdb_score aspect_ratio movie_facebook_likes
count 4867.000000 4901.000000 4814.000000 4893.000000 4909.000000 4.054000e+03 4.916000e+03 4916.000000 4903.000000 4895.000000 4.432000e+03 4810.000000 4903.000000 4916.000000 4590.000000 4916.000000
mean 137.988905 107.090798 691.014541 631.276313 6494.488491 4.764451e+07 8.264492e+04 9579.815907 1.377320 267.668846 3.654749e+07 2002.447609 1621.923516 6.437429 2.222349 7348.294142
std 120.239379 25.286015 2832.954125 1625.874802 15106.986884 6.737255e+07 1.383222e+05 18164.316990 2.023826 372.934839 1.002427e+08 12.453977 4011.299523 1.127802 1.402940 19206.016458
min 1.000000 7.000000 0.000000 0.000000 0.000000 1.620000e+02 5.000000e+00 0.000000 0.000000 1.000000 2.180000e+02 1916.000000 0.000000 1.600000 1.180000 0.000000
25% 49.000000 93.000000 7.000000 132.000000 607.000000 5.019656e+06 8.361750e+03 1394.750000 0.000000 64.000000 6.000000e+06 1999.000000 277.000000 5.800000 1.850000 0.000000
50% 108.000000 103.000000 48.000000 366.000000 982.000000 2.504396e+07 3.313250e+04 3049.000000 1.000000 153.000000 1.985000e+07 2005.000000 593.000000 6.600000 2.350000 159.000000
75% 191.000000 118.000000 189.750000 633.000000 11000.000000 6.110841e+07 9.377275e+04 13616.750000 2.000000 320.500000 4.300000e+07 2011.000000 912.000000 7.200000 2.350000 2000.000000
max 813.000000 511.000000 23000.000000 23000.000000 640000.000000 7.605058e+08 1.689764e+06 656730.000000 43.000000 5060.000000 4.200000e+09 2016.000000 137000.000000 9.500000 16.000000 349000.000000
df.describe(include=['object'])
# 결츨치가 아닌 개수, 
#컬러인지 아닌지,
# 컬러가 4693 
color director_name actor_2_name genres actor_1_name movie_title actor_3_name plot_keywords movie_imdb_link language country content_rating
count 4897 4814 4903 4916 4909 4916 4893 4764 4916 4904 4911 4616
unique 2 2397 3030 914 2095 4916 3519 4756 4916 47 65 18
top Color Steven Spielberg Morgan Freeman Drama Robert De Niro Avatar Steve Coogan based on novel http://www.imdb.com/title/tt0499549/?ref_=fn_t... English USA R
freq 4693 26 18 233 48 1 8 4 1 4582 3710 2067
df.describe(include=['int32', 'float64']) #int32, float64 를 포함한 타입의 컬럼.
num_critic_for_reviews duration director_facebook_likes actor_3_facebook_likes actor_1_facebook_likes gross facenumber_in_poster num_user_for_reviews budget title_year actor_2_facebook_likes imdb_score aspect_ratio
count 4867.000000 4901.000000 4814.000000 4893.000000 4909.000000 4.054000e+03 4903.000000 4895.000000 4.432000e+03 4810.000000 4903.000000 4916.000000 4590.000000
mean 137.988905 107.090798 691.014541 631.276313 6494.488491 4.764451e+07 1.377320 267.668846 3.654749e+07 2002.447609 1621.923516 6.437429 2.222349
std 120.239379 25.286015 2832.954125 1625.874802 15106.986884 6.737255e+07 2.023826 372.934839 1.002427e+08 12.453977 4011.299523 1.127802 1.402940
min 1.000000 7.000000 0.000000 0.000000 0.000000 1.620000e+02 0.000000 1.000000 2.180000e+02 1916.000000 0.000000 1.600000 1.180000
25% 49.000000 93.000000 7.000000 132.000000 607.000000 5.019656e+06 0.000000 64.000000 6.000000e+06 1999.000000 277.000000 5.800000 1.850000
50% 108.000000 103.000000 48.000000 366.000000 982.000000 2.504396e+07 1.000000 153.000000 1.985000e+07 2005.000000 593.000000 6.600000 2.350000
75% 191.000000 118.000000 189.750000 633.000000 11000.000000 6.110841e+07 2.000000 320.500000 4.300000e+07 2011.000000 912.000000 7.200000 2.350000
max 813.000000 511.000000 23000.000000 23000.000000 640000.000000 7.605058e+08 43.000000 5060.000000 4.200000e+09 2016.000000 137000.000000 9.500000 16.000000
df.describe(exclude=['float64']) #float64 를뺴고 나머지 타입의 컬럼.
color director_name actor_2_name genres actor_1_name movie_title num_voted_users cast_total_facebook_likes actor_3_name plot_keywords movie_imdb_link language country content_rating movie_facebook_likes
count 4897 4814 4903 4916 4909 4916 4.916000e+03 4916.000000 4893 4764 4916 4904 4911 4616 4916.000000
unique 2 2397 3030 914 2095 4916 NaN NaN 3519 4756 4916 47 65 18 NaN
top Color Steven Spielberg Morgan Freeman Drama Robert De Niro Avatar NaN NaN Steve Coogan based on novel http://www.imdb.com/title/tt0499549/?ref_=fn_t... English USA R NaN
freq 4693 26 18 233 48 1 NaN NaN 8 4 1 4582 3710 2067 NaN
mean NaN NaN NaN NaN NaN NaN 8.264492e+04 9579.815907 NaN NaN NaN NaN NaN NaN 7348.294142
std NaN NaN NaN NaN NaN NaN 1.383222e+05 18164.316990 NaN NaN NaN NaN NaN NaN 19206.016458
min NaN NaN NaN NaN NaN NaN 5.000000e+00 0.000000 NaN NaN NaN NaN NaN NaN 0.000000
25% NaN NaN NaN NaN NaN NaN 8.361750e+03 1394.750000 NaN NaN NaN NaN NaN NaN 0.000000
50% NaN NaN NaN NaN NaN NaN 3.313250e+04 3049.000000 NaN NaN NaN NaN NaN NaN 159.000000
75% NaN NaN NaN NaN NaN NaN 9.377275e+04 13616.750000 NaN NaN NaN NaN NaN NaN 2000.000000
max NaN NaN NaN NaN NaN NaN 1.689764e+06 656730.000000 NaN NaN NaN NaN NaN NaN 349000.000000
df.describe(include=['object']).T # DF.T 행과 열을 바꿈
count unique top freq
color 4897 2 Color 4693
director_name 4814 2397 Steven Spielberg 26
actor_2_name 4903 3030 Morgan Freeman 18
genres 4916 914 Drama 233
actor_1_name 4909 2095 Robert De Niro 48
movie_title 4916 4916 Avatar 1
actor_3_name 4893 3519 Steve Coogan 8
plot_keywords 4764 4756 based on novel 4
movie_imdb_link 4916 4916 http://www.imdb.com/title/tt0499549/?ref_=fn_t... 1
language 4904 47 English 4582
country 4911 65 USA 3710
content_rating 4616 18 R 2067
df.mean(numeric_only=None) # 수치형(정수, 실수)
# 핑크색 안내의 의미 - 지금은 정상 가동 가능하지만, 나중에는 문제가 될 수도 있다.
/var/folders/nc/lry6d8ws417_mblykm_8wpc40000gn/T/ipykernel_1183/2254227961.py:1: FutureWarning: The default value of numeric_only in DataFrame.mean is deprecated. In a future version, it will default to False. In addition, specifying 'numeric_only=None' is deprecated. Select only valid columns or specify the value of numeric_only to silence this warning.
  df.mean() # 수치형(정수, 실수)





num_critic_for_reviews       1.379889e+02
duration                     1.070908e+02
director_facebook_likes      6.910145e+02
actor_3_facebook_likes       6.312763e+02
actor_1_facebook_likes       6.494488e+03
gross                        4.764451e+07
num_voted_users              8.264492e+04
cast_total_facebook_likes    9.579816e+03
facenumber_in_poster         1.377320e+00
num_user_for_reviews         2.676688e+02
budget                       3.654749e+07
title_year                   2.002448e+03
actor_2_facebook_likes       1.621924e+03
imdb_score                   6.437429e+00
aspect_ratio                 2.222349e+00
movie_facebook_likes         7.348294e+03
dtype: float64
df.mean(numeric_only=True) # 핑크색 안내 내용에 따라 'numeric_only'를 True로 실행하면 정상적으로 구동 확인.
num_critic_for_reviews       1.379889e+02
duration                     1.070908e+02
director_facebook_likes      6.910145e+02
actor_3_facebook_likes       6.312763e+02
actor_1_facebook_likes       6.494488e+03
gross                        4.764451e+07
num_voted_users              8.264492e+04
cast_total_facebook_likes    9.579816e+03
facenumber_in_poster         1.377320e+00
num_user_for_reviews         2.676688e+02
budget                       3.654749e+07
title_year                   2.002448e+03
actor_2_facebook_likes       1.621924e+03
imdb_score                   6.437429e+00
aspect_ratio                 2.222349e+00
movie_facebook_likes         7.348294e+03
dtype: float64

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

컬럼이름/행이름 조회

  • DataFrame객체.columns
    • 컬럼명 조회
    • 컬럼명은 차후 조회를 위해 따로 변수에 저장하는 것이 좋다.
  • DataFrame객체.index
    • 행명 조회
movie.columns
Index(['color', 'director_name', 'num_critic_for_reviews', 'duration',
       'director_facebook_likes', 'actor_3_facebook_likes', 'actor_2_name',
       'actor_1_facebook_likes', 'gross', 'genres', 'actor_1_name',
       'movie_title', 'num_voted_users', 'cast_total_facebook_likes',
       'actor_3_name', 'facenumber_in_poster', 'plot_keywords',
       'movie_imdb_link', 'num_user_for_reviews', 'language', 'country',
       'content_rating', 'budget', 'title_year', 'actor_2_facebook_likes',
       'imdb_score', 'aspect_ratio', 'movie_facebook_likes'],
      dtype='object')
movie.index
RangeIndex(start=0, stop=4916, step=1)
movie.columns[3]
movie.columns[3:10]
Index(['duration', 'director_facebook_likes', 'actor_3_facebook_likes',
       'actor_2_name', 'actor_1_facebook_likes', 'gross', 'genres'],
      dtype='object')

컬럼이름/행이름 변경

  • columns와 index 속성으로는 통째로 바꾸는 것은 가능하나 일부만 선택해서 변경하는 것은 안된다.
    • df.columns = ['새이름','새이름', ... , '새이름']
    • df.columns[1] = '새이름'
      • 이런식으로 개별적으로 변경은 안된다.
dic = {
    'id':['id-1', 'id-2', 'id-3', 'id-4', 'id-5'],
    '국어':[100,50,70,60,90],
    '영어':[90,80,100,60,40]
    
}
grade = pd.DataFrame(dic)
grade= pd.read_csv('saved_data/grade2.csv')
grade
id korean english
0 id-1 100 90
1 id-2 50 80
2 id-3 70 100
3 id-4 60 60
4 id-5 90 40
grade.columns
Index(['index', 'ID', 'KOREAN', 'ENGLISH'], dtype='object')
grade.columns = ['ID','국어','영어'] # dataframe 원본이 바뀜.
grade
ID 국어 영어
0 id-1 100 90
1 id-2 50 80
2 id-3 70 100
3 id-4 60 60
4 id-5 90 40
grade.columns = ['ID','수학','영어'] # 국어를 수학으로 바꾸는 개별 컬럼 변경은 불가능하다. 
# 튜플같은 개념이라 완전히 새로운 dataframe을 만들어야함

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

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

컬럼 index 옮기는 명령어.

  • DataFrame객체.set_index(컬럼이름, inplace=False)
    • 특정 컬럼을 행의 index 명으로 사용
    • 열이 index명이 되면서 그 컬럼은 Data Set 에서 제거된다.
  • DataFrame객체.reset_index(inplace=False)
    • index를 첫번째 컬럼으로 복원
# ID를 컬럼을\ 행 식별자(index name) 으로 지정.
grade.set_index('ID', inplace=True)
grade
KOREAN ENGLISH
ID
id-1 100 90
id-2 50 80
id-3 70 100
id-4 60 60
id-5 90 40
grade.to_csv('saved_data/grade7.csv', index = False)
grade2 = pd.read_csv('saved_data/grade7.csv', index_col= 'id')
grade2
index korean english
id
id-1 0 100 90
id-2 1 50 80
id-3 2 70 100
id-4 3 60 60
id-5 4 90 40
grade.reset_index(inplace = True) # index name을 컬럼으로(값)을 뺀다.\
grade
ID KOREAN ENGLISH
0 id-1 100 90
1 id-2 50 80
2 id-3 70 100
3 id-4 60 60
4 id-5 90 40
grade8 = grade.iloc[[4,2,3,1,0]] # 행조회 (index- 순번-으로 조회)
grade8.reset_index(drop=True) # index 이름을 제거 -> index이름은 순번으로 변경.
ID KOREAN ENGLISH
0 id-5 90 40
1 id-3 70 100
2 id-4 60 60
3 id-2 50 80
4 id-1 100 90

행과 열의 값 변경

특정 행 또는 열 삭제

  • DataFrame객체.drop(columns, index, inplace=False)
    • columns : 삭제할 열이름 또는 열이름 리스트
    • index : 삭제할 index명 또는 index 리스트
    • inplace: 원본을 변경할지 여부(boolean)
grade
id KOREAN ENGLISH
0 id-1 100 90
1 id-2 50 80
2 id-3 70 100
3 id-4 60 60
4 id-5 90 40
# 컬럼 삭제
grade.drop(columns="KOREAN")
grade.drop(columns=['KOREAN', 'ENGLISH'])
ID
0 id-1
id-2
id-3
id-4
id-5
# 행 삭제
grade.drop(index='이')
grade.drop(index=['일','이','사'])
ID KOREAN ENGLISH
0 id-1 100 90
id-4 60 60
grade7.drop(index='id-2')
grade7.drop(index=['id-1','id-3'])
Unnamed: 0 index KOREAN ENGLISH
ID
id-2 1 1 50 80
id-4 3 3 60 60
id-5 4 4 90 40
grade7.drop(labels='KOREAN',axis=1) #컬럼삭제
Unnamed: 0 index ENGLISH
ID
id-1 0 0 90
id-2 1 1 80
id-3 2 2 100
id-4 3 3 60
id-5 4 4 40
grade7.drop(labels=['id-3','id-1'], axis=0) #행 삭제
Unnamed: 0 index KOREAN ENGLISH
ID
id-2 1 1 50 80
id-4 3 3 60 60
id-5 4 4 90 40
grade.shape # (5,3)중  5는 행 0번축 //// 3은 열 1번축
(5, 3)

열 추가

  • 새로운 열을 지정 후 값을 대입하면 새로운 열을 추가할 수 있다.
    • 보통 파생변수를 만들 때 사용한다.
  • 열 추가
    • df['새열명'] = 값
    • 마지막 열로 추가된다.
    • 하나의 값을 대입하면 모든 행에 그 값이 대입된다.
    • 다른 값을 주려면 배열에 담아서 대입한다.
  • 열 삽입
    • df.insert(삽입할 위치 index, 삽입할 열이름, 값)
  • 파생변수생성
    • 기존 열들의 값을 이용해서 만든 열을 파생변수라고 한다. ######## 값의 계산으로 얻은 변수
    • 벡터화 연산을 이용하여 값 대입한다.
    • df[‘새열이름’] = 기존 열들을 이용한 연산
# 컴럼값 조회
# 컬럼값 변경 df['컬럼명'] = 값 (없는 컴러미 추가, 있는 컬럼: 변경)
grade['MATH'] = 90 # 추가
grade
ID KOREAN ENGLISH MATH
0 id-1 100 90 90
1 id-2 50 80 90
2 id-3 70 100 90
3 id-4 60 60 90
4 id-5 90 40 90
grade['PYTHON'] = [100,20,50,60,40] # 추가
grade
ID KOREAN ENGLISH MATH PYTHON
0 id-1 100 90 90 100
1 id-2 50 80 90 20
2 id-3 70 100 90 50
3 id-4 60 60 90 60
4 id-5 90 40 90 40
# 열의 값들을 조회
# 한개 컬럼 조회 -> Series로 변환
grade['KOREAN']
0    100
1     50
2     70
3     60
4     90
Name: KOREAN, dtype: int64
index name ==> 조회 DataFrame의 index name
0                                            100 => 0행의 KOREAN값 100
1                                             50
2                                             70
3                                             60
4                                             90
Name: KOREAN, dtype: int64
Name -> 조회한 컬럼.
grade['총점']= grade['KOREAN'] + grade["MATH"] + grade['ENGLISH'] + grade["PYTHON"] 
# 같은 index를 갖고있어 연산 가능.
grade['평균'] = grade['총점'] / 4
grade
ID KOREAN ENGLISH MATH PYTHON 총점 평균
0 id-1 100 90 90 100 380 95.0
1 id-2 50 80 90 20 240 60.0
2 id-3 70 100 90 50 310 77.5
3 id-4 60 60 90 60 270 67.5
4 id-5 90 40 90 40 260 65.0
g = grade.set_index('ID')
g
KOREAN ENGLISH MATH PYTHON 총점 평균
ID
id-1 100 90 90 100 380 95.0
id-2 50 80 90 20 240 60.0
id-3 70 100 90 50 310 77.5
id-4 60 60 90 60 270 67.5
id-5 90 40 90 40 260 65.0
g2 = g.drop(labels=['총점','평균'], axis = 1)
g2
KOREAN ENGLISH MATH PYTHON
ID
id-1 100 90 90 100
id-2 50 80 90 20
id-3 70 100 90 50
id-4 60 60 90 60
id-5 90 40 90 40
g2.sum() # 각 컬럼의 합의 값이다.
KOREAN     370
ENGLISH    370
MATH       450
PYTHON     270
dtype: int64
total = g2.sum(axis=1) #axis=1 -----------> 이방향으로 계산. 그럼, 한 사람의 총점을 구할 수 있다.
avg = g2.mean(axis=1)
g2['총점'] = total
g2['평균'] = avg
g2
KOREAN ENGLISH MATH PYTHON 총점 평균
ID
id-1 100 90 90 100 380 95.0
id-2 50 80 90 20 240 60.0
id-3 70 100 90 50 310 77.5
id-4 60 60 90 60 270 67.5
id-5 90 40 90 40 260 65.0
g2.sum()
g2.mean()
KOREAN      74.0
ENGLISH     74.0
MATH        90.0
PYTHON      54.0
총점         292.0
평균          73.0
dtype: float64
# 행 추가
g2.loc['평균'] = g2.mean()
g2
KOREAN ENGLISH MATH PYTHON 총점 평균
ID
id-1 100.0 90.0 90.0 100.0 380.0 95.0
id-2 50.0 80.0 90.0 20.0 240.0 60.0
id-3 70.0 100.0 90.0 50.0 310.0 77.5
id-4 60.0 60.0 90.0 60.0 270.0 67.5
id-5 90.0 40.0 90.0 40.0 260.0 65.0
평균 74.0 74.0 90.0 54.0 292.0 73.0
# 행조회
g2.loc['id-5'] # 행 이름으로 조회
g2.iloc[4]     # 행 순번으로 조회
KOREAN      90.0
ENGLISH     40.0
MATH        90.0
PYTHON      40.0
총점         260.0
평균          65.0
Name: id-5, dtype: float64

행, 열의 값 조회

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

열의 값 조회

  • df[‘열이름’]
    • 열이름의 열 조회
  • df.열이름
    • 열이름이 Python 식별자 규칙에 맞으면 . 표기법을 사용할 수 있다.
  • Fancy indexing
    • 여러개의 열들을 한번에 조회할 경우 열이름들을 리스트로 묶어서 전달한다.
  • 주의
    • 열은 순번으로는 조회할 수 없다.
    • 열 조회 indexer에서 슬라이싱을 하면 행 조회 Slicing이다.
      • 만약 indexing이나 slicing을 이용해 열들을 조회하려면 columns 속성을 이용한다.
        • df[df.columns[:3]]
g2['KOREAN']
g2.KOREAN
ID
id-1    100.0
id-2     50.0
id-3     70.0
id-4     60.0
id-5     90.0
평균       74.0
Name: KOREAN, dtype: float64
g2['KOREAN'] # 대소문자 구분.
g2[0] # 컬럼 순번으로는 조회할 수 없다.
g2.columns[0]
g2[g2.columns[0]] # 컬럼 순버능로 죄하려면 columns를 이용.
0    id-1
1    id-2
2    id-3
3    id-4
4    id-5
Name: ID, dtype: object
col = g2.columns # g2.columns 입력이 번거러울 시 변수 설정 이후 값 적용.
g2[col[0]]
0    id-1
1    id-2
2    id-3
3    id-4
4    id-5
Name: ID, dtype: object
g2[1:4] # 행 slicing
ID KOREAN ENGLISH MATH PYTHON 총점 평균
1 id-2 50 80 90 20 240 60.0
2 id-3 70 100 90 50 310 77.5
3 id-4 60 60 90 60 270 67.5

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

  • select_dtypes(include=[데이터타입,..], exclude=[데이터타입,..])
    • 전달한 데이터 타입의 열들을 조회.
    • include : 조회할 열 데이터 타입
    • exclude : 제외하고 조회할 열 데이터 타입
  • filter (items=[], like='', regex='')
    • 매개변수에 전달하는 열의 이름에 따라 조회
    • 각 매개변수중 하나만 사용할 수 있다.
    • items = [컬럼명들, ..]
      • 리스트와 일치하는 열들 조회
      • 이름이 일치 하지 않아도 Error 발생안함.
    • like = ‘부분일치문자열’
      • 전달한 문자열이 들어간 열들 조회
      • 부분일치 개념
    • regex = ‘정규표현식’
      • 정규 표현식을 이용해 열명의 패턴으로 조회
g2.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 5 entries, 0 to 4
Data columns (total 9 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   id       5 non-null      object 
 1   KOREAN   5 non-null      int64  
 2   ENGLISH  5 non-null      int64  
 3   MATH     5 non-null      int64  
 4   PYTHON   5 non-null      int64  
 5   총점       5 non-null      int64  
 6   평균       5 non-null      float64
 7   Pass     5 non-null      bool   
 8   Pass2    5 non-null      object 
dtypes: bool(1), float64(1), int64(5), object(2)
memory usage: 365.0+ bytes
# 컬럼(Series)의 data type을 변경
g2['MATH'].astype('int32') # 원본을 바꾸지 않는다 / 단지 조회한 것이다.

0    90
1    90
2    90
3    90
4    90
Name: MATH, dtype: int32
g2.select_dtypes(include= 'float64')
g2.select_dtypes(include= ['float64', 'int32'])
MATH 평균
0 90 95.0
1 90 60.0
2 90 77.5
3 90 67.5
4 90 65.0
# 조회대상에서 제외하려는 타입을 지정.
g2.select_dtypes(exclude='int64')
g2.select_dtypes(exclude=['int64','int64'])
KOREAN ENGLISH MATH PYTHON 총점 평균
ID
id-1 100.0 90.0 90.0 100.0 380.0 95.0
id-2 50.0 80.0 90.0 20.0 240.0 60.0
id-3 70.0 100.0 90.0 50.0 310.0 77.5
id-4 60.0 60.0 90.0 60.0 270.0 67.5
id-5 90.0 40.0 90.0 40.0 260.0 65.0
평균 74.0 74.0 90.0 54.0 292.0 73.0
# filter()
# g2['KOR'] # indexer는 없는 컬럼 조회시 Exception 발생(KeyError)
g2.filter(items='KOR') # 없는 컬럼 조회하면 Exception 발생하지 않고 무시.
g2.filter(items=['KOREAN','ENGLISH','MUSIC','PAINTING'])
KOREAN ENGLISH
ID
id-1 100.0 90.0
id-2 50.0 80.0
id-3 70.0 100.0
id-4 60.0 60.0
id-5 90.0 40.0
평균 74.0 74.0
g2.filter(like="PASS") # 컬럼명에 PASS가 들어간 컬럼을 조회.
ID
id-1
id-2
id-3
id-4
id-5
평균
g2.filter(regex='\w{5,}') # 컬럼명이 5글자 이상인 컬럼들을 조회
KOREAN ENGLISH PYTHON
ID
id-1 100.0 90.0 100.0
id-2 50.0 80.0 20.0
id-3 70.0 100.0 50.0
id-4 60.0 60.0 60.0
id-5 90.0 40.0 40.0
평균 74.0 74.0 54.0

행 조회

  • 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이름 , 컬럼이름]
    • 행과 열 조회
    • 둘다 이름으로 지정해야 함.
g2
KOREAN ENGLISH MATH PYTHON 총점 평균
ID
id-1 100.0 90.0 90.0 100.0 380.0 95.0
id-2 50.0 80.0 90.0 20.0 240.0 60.0
id-3 70.0 100.0 90.0 50.0 310.0 77.5
id-4 60.0 60.0 90.0 60.0 270.0 67.5
id-5 90.0 40.0 90.0 40.0 260.0 65.0
평균 74.0 74.0 90.0 54.0 292.0 73.0
g2.loc[1]
"""
id          id-2
KOREAN        50
ENGLISH       80
MATH          90
PYTHON        20
총점           240
평균          60.0
Pass       False
Pass2         낙제
Name: 1, dtype: object
"""
g2.loc[['id-1','id-2']] # fancy indexing
KOREAN ENGLISH MATH PYTHON 총점 평균
ID
id-1 100.0 90.0 90.0 100.0 380.0 95.0
id-2 50.0 80.0 90.0 20.0 240.0 60.0
# 행조회는 slicing 지원
g2.loc['id-1':'id-5'] # stop index 도 포함 
g2.loc['id-1':'id-5':2]
g2.loc['id-1':] # stop 생략 => 마지막 행까지 다 조회
g2.loc[:'id-2'] # start 생략 => 시작 행(0번 행) 부터 조회
KOREAN ENGLISH MATH PYTHON 총점 평균
ID
id-1 100.0 90.0 90.0 100.0 380.0 95.0
id-2 50.0 80.0 90.0 20.0 240.0 60.0
# g2.loc[1]['KOREAN']
g2.loc['id-1','KOREAN']
# df.loc[ 행조회, 열조회] == 행/열 모두 이름
100.0
g2.loc[['id-1','id-2','id-4'], '총점'] # 행: fancy indexing, 열: 하나를 지정
g2.loc[['id-1','id-2','id-4'], ['총점', '평균']] # 행: fancy indexing, 열: fancy indexing
g2.loc[['id-1','id-2'],:"PYTHON"]  # 행: 하나또는 두개 지정. 열:slicing(loc 에서는 열도 slicing 가능.)
KOREAN ENGLISH MATH PYTHON
ID
id-1 100.0 90.0 90.0 100.0
id-2 50.0 80.0 90.0 20.0
g2.loc[1:3,'ENGLISH':"평균"] # 행/열 모두 slicing
ENGLISH MATH PYTHON 총점 평균
1 80 90 20 240 60.0
2 100 90 50 310 77.5
3 60 90 60 270 67.5
g2.loc[1,0] # 컬럼명이 0인 컬럼조회. loc index는 행/열 모두 이름으로 조회. Exception 발생.

iloc

  • index(행 순번)으로 조회
  • DF.iloc[행번호]
    • 한 행 조회.
    • 조회할 행 번호 전달
  • DF.iloc[ 행번호 리스트 ]
    • 여러 행 조회.
    • 조회할 행 번호 리스트 전달
  • DF.iloc[start 행번호: stop 행번호: step]
    • 슬라이싱 지원
    • stop 행번호 포함 안함.
  • DF.iloc[행번호 , 열번호]
    • 행과 열 조회
    • 행열 모두 순번으로 지정
# g2[2] # 컬럼이 이름이 2인 열을 조회
g2.loc['id-2'] #행(index)이름이 2인 행을 조회
g2.iloc[2] #index(순번) 이름이 2인 행을 조회
KOREAN      70.0
ENGLISH    100.0
MATH        90.0
PYTHON      50.0
총점         310.0
평균          77.5
Name: id-3, dtype: float64
g2.iloc[[2,1,4]] #fancy indexing : list 순번으로 조회
KOREAN ENGLISH MATH PYTHON 총점 평균
ID
id-3 70.0 100.0 90.0 50.0 310.0 77.5
id-2 50.0 80.0 90.0 20.0 240.0 60.0
id-5 90.0 40.0 90.0 40.0 260.0 65.0
g2.iloc[-3:] # 뒤에서 3번쨰 행 ~ 끝까지 
g2.tail(3) # 위에 명령어랑 같음.
KOREAN ENGLISH MATH PYTHON 총점 평균
ID
id-4 60.0 60.0 90.0 60.0 270.0 67.5
id-5 90.0 40.0 90.0 40.0 260.0 65.0
평균 74.0 74.0 90.0 54.0 292.0 73.0
g2.iloc[::-1] # 리버스
KOREAN ENGLISH MATH PYTHON 총점 평균
ID
평균 74.0 74.0 90.0 54.0 292.0 73.0
id-5 90.0 40.0 90.0 40.0 260.0 65.0
id-4 60.0 60.0 90.0 60.0 270.0 67.5
id-3 70.0 100.0 90.0 50.0 310.0 77.5
id-2 50.0 80.0 90.0 20.0 240.0 60.0
id-1 100.0 90.0 90.0 100.0 380.0 95.0
# g2.iloc[3,"ENGLISH"]  =>  iloc [행 순번, 열 순번] 으로 해야함.
                        # 둘다 수넙능ㄹ 이용해서 지정 (indexing slcing, facy indexing 문법 사용가능)

g2.iloc[3, 1]
g2.iloc[[1,3],[2,5]] # 열 2번 5번
g2.iloc[[1,3],:4] # 열 0 ~ 3번(4번은 포함하지 않음)
KOREAN ENGLISH MATH PYTHON
ID
id-2 50.0 80.0 90.0 20.0
id-4 60.0 60.0 90.0 60.0

Boolean indexing을 이용한 조회

  • 원하는 조건을 만족하는 행, 열을 조회한다.

  • DataFrame객체[조건], DataFrame객체.loc[조건]
    • 조건이 True인 행만 조회
    • 열까지 선택시
      • DataFrame객체[조건][열]
      • DataFrame객체.loc[조건, 열]
  • iloc indexer는 boolean indexing을 지원하지 않는다.
  • 논리연산자 |논리연산자|설명| |:-:|-| |&|and연산| |||or연산| |~|not 연산|
  • 논리연산자의 피연산자들은 반드시 ( )로 묶어준다.
  • 파이썬과는 다르게 and, or, not 예약어는 사용할 수 없다.
# 국어점수가 80이상인 행을 조회
g2[g2['KOREAN'] >= 80] 
KOREAN ENGLISH MATH PYTHON 총점 평균
ID
id-1 100.0 90.0 90.0 100.0 380.0 95.0
id-5 90.0 40.0 90.0 40.0 260.0 65.0
# 국어가 60~80 사이인 행들
g2[(g2['KOREAN'] >= 60) & (g2['KOREAN'] <=80)]
g2[g2['KOREAN'].between(60,80)]
KOREAN ENGLISH MATH PYTHON 총점 평균
ID
id-3 70.0 100.0 90.0 50.0 310.0 77.5
id-4 60.0 60.0 90.0 60.0 270.0 67.5
평균 74.0 74.0 90.0 54.0 292.0 73.0
# 국어가 60~80 사이이고 영어가 100점인 행들
g2[(g2['KOREAN'] >= 60) & (g2['KOREAN'] <=80) & (g2['ENGLISH'] == 100)]
id KOREAN ENGLISH MATH PYTHON 총점 평균 Pass Pass2
2 id-3 70 100 90 50 310 77.5 False 낙제
# 국어가 60~80 사이이고 영어가 100점인 행들의 국어, 영어, 평균점수를 확인
g2[(g2['KOREAN'] >= 60) & (g2['KOREAN'] <=80) & (g2['ENGLISH'] == 100)][['KOREAN', "ENGLISH", "평균"]]
KOREAN ENGLISH 평균
ID
id-3 70.0 100.0 77.5
g2[g2['KOREAN'].between(60,80) & (g2['ENGLISH'] ==100)][['KOREAN', "ENGLISH", "평균"]]
KOREAN ENGLISH 평균
ID
id-3 70.0 100.0 77.5
# df.loc [행 -> boolen index, 열]
g2.loc[g2['KOREAN'].between(60,80) & (g2['ENGLISH'] ==100), ['KOREAN', "ENGLISH", "평균"]]
KOREAN ENGLISH 평균
ID
id-3 70.0 100.0 77.5

query() 를 이용한 boolean indexing

  • query(조회조건)
    • sql의 where 절의 조건 처럼 문자열의 query statement를 이용해 조건으로 조회
    • boolean index에 비해
      • 장점: 편의성(문자열로 query statement를 만들므로 동적 구문 생성등 다양한 처리가 가능)과 가독성이 좋다.
      • 단점: 속도가 느리다.
  • 조회조건 구문
    • "컬럼명 연산자 비교값"
  • 외부변수를 이용해 query문의 비교값을 지정할 수 있다.
    • query 문자열 안에서 @변수명 사용
    • f string이나 format() 함수를 이용해 query를 만들 수도 있다.

query 함수 연산자

  • 비교 연산자
    • ==, >, >=, <, <=, !=
  • 결측치 비교
    • 컬럼.isna(), isnull()
    • 컬럼.notna(), notnull()
  • 논리 연산자
    • and, or, not
  • in 연산자
    • in, ==
    • not in, !=
    • 비교 대상값은 리스트에 넣는다.
  • Index name으로 검색
    • 행의 index 이름으로 검색
  • 문자열 부분검색(sql의 like)
    • 컬럼명.str.contains(문자열): 문자열을 포함하고 있는
    • 컬럼명.str.startswith(문자열): 문자열로 시작하는
    • 컬럼명.str.endswith(문자열): 문자열로 끝나는
    • 문자열 부분검색을 할 컬럼에 결측치(NaN)이 있으면 안된다.
import pandas as pd
import numpy as np
data_dict = {
    'name':['김영수', '박영희', '오준호', '조민경', '박영희', '김영수'],
    'age':[23, 17, 28, 31, 23, 17],
    'email':['s@gmail.com', 'pyh@gmail.com', 'ojh@daum.net', 'cmk@naver.com', 'pyh@daum.net', np.nan]
}
df = pd.DataFrame(data_dict)
df
name age email
0 김영수 23 s@gmail.com
1 박영희 17 pyh@gmail.com
2 오준호 28 ojh@daum.net
3 조민경 31 cmk@naver.com
4 박영희 23 pyh@daum.net
5 김영수 17 NaN
# 비교연산
# 나이가 17세인 사람
# df[df['age'] == 17]
df.query('age==17') # 조회대상데이터프레임.query('컬럼명 == 비교값')
df.query('age>25')
df.query('age!=17')
name age email
0 김영수 23 kys@gmail.com
2 오준호 28 ojh@daum.net
3 조민경 31 cmk@naver.com
4 박영희 23 pyh@daum.net
# 결측치가 있는 행
df.query('email.isna()') # 대상컬럼.isnull(),isna()
df.query('email.isnull()')
name age email
5 김영수 17 NaN
# 결측치가 없는 행
df.query('email.notna()')
df.query('email.notnull()')
name age email
0 김영수 23 kys@gmail.com
1 박영희 17 pyh@gmail.com
2 오준호 28 ojh@daum.net
3 조민경 31 cmk@naver.com
4 박영희 23 pyh@daum.net
# 논리연산 -> and, or, not 을 사용가능. (&,|, ~ 사용가능.)
df.query('not age<25')
df.query('~(age<25)')
name age email
2 오준호 28 ojh@daum.net
3 조민경 31 cmk@naver.com
df.query('name=="박영희" and age>20') # 비교값이 문자열(str) 일때는 따옴표로 묶어준다.
df.query('(name=="박영희") & (age>20)') # query 메소드에서는 기로 비교연산을 할때 ()로 피연산자 안묶어도 된다.
name age email
4 박영희 23 pyh@daum.net
# 나이가 17 이거나 23인 행을 조회
df.query('age==17 or age==23') # 동일한 컬럼으로 여러개의 값과 == 비교.
df.query('age == [17,23]')
df.query('age in [17,23]')
name age email
0 김영수 23 kys@gmail.com
1 박영희 17 pyh@gmail.com
4 박영희 23 pyh@daum.net
5 김영수 17 NaN
# 나이가 17 이거나 23이 아닌 행을 조회
df.query('age!=17 and age!=23') # 동일한 컬럼으로 여러개의 값과 == 비교.
df.query('age != [17,23]')
df.query('age not in [17,23]')
name age email
2 오준호 28 ojh@daum.net
3 조민경 31 cmk@naver.com
# index 이름으로 조건 지정. ==> index 키워드 사용.
# index 이름이 3인 행을 조회
df.query('index == 3') # 데이터프레임으로 반환

name age email
3 조민경 31 cmk@naver.com
df.query('index in [1,3,4]')
name age email
1 박영희 17 pyh@gmail.com
3 조민경 31 cmk@naver.com
4 박영희 23 pyh@daum.net
# 문자열컬럼값과 부분 일치 조회
# 성이 김씨인 행 조회
df.query('name.str.startswith("김")')  # name 컬럼의 값들 중 '김'으로 시작하는 행
name age email
0 김영수 23 kys@gmail.com
5 김영수 17 NaN
# 이름이 영희 행을 조회
df.query('name.str.endswith("영희")') # name 컬럼의 값들 중 '영희' 로 끝나는 행
df.query('name.str.contains("영희")') # name 컬럼의 값들 중 '영희' 를 포함한 행
name age email
1 박영희 17 pyh@gmail.com
4 박영희 23 pyh@daum.net
# 이메일주소가 com으로 끝나는 행들
# 문자열 부분일치 조회 -> 결측치가 있는 행은 조회가 힘듬(ValueError 발생)
df.query('email.str.endswith("com")')
# 1. email이 결측치가 아닌 행을 조회 -> 2. 조건을 조회
df.query('email.notnull()').query('email.str.endswith("com")')
# (메소드, 함수)chaining - 계속 연결해서 처리 진행.
name age email
0 김영수 23 kys@gmail.com
1 박영희 17 pyh@gmail.com
3 조민경 31 cmk@naver.com
# 외부변수의 값을 이용해서 query statement를 생성.
name = input('조회할 이름:')
#format 문자열
# df.query(f'name == "{name}"')
df.query('name == @name') # name == 변수_name의 값 ==> 문자열일 경우 따음표 처리를 해준다.
조회할 이름:박영희
name age email
1 박영희 17 pyh@gmail.com
4 박영희 23 pyh@daum.net
name = input('조회할 이름:')
age = int(input('조회할 나이:')) # 숫자형은 숫자(정수, 실수) 타입으로 변환 한 뒤 처리.
df.query('name == @name and age > @age')
조회할 이름:박영희
조회할 나이:20
name age email
4 박영희 23 pyh@daum.net

댓글남기기