본문 바로가기
[ Python ]

[Python] Pandas 기초/ DataFrame / Series / 실습

by 히앤님 2020. 10. 27.
반응형
SMALL

Pandas 

온전히 통계 분석을 위해 고안된 R 과는 다르게 python은 일반적인 프로그래밍 언어(general purpose programming language) 이며, 데이터 분석을 하기 위해서는 여러가지 라이브러리를 사용할 수 밖에 없다. 이 패키지들 중 R의 dataframe 데이터 타입을 참고하여 만든 것이 바로 pandas dataframe이다. pandas는 dataframe을 주로 다루기 위한 라이브러리이며, dataframe을 자유롭게 가공하는 것은 데이터 과학자들에게 중요하다.(출처) 

모양은 엑셀 시트를 하나의 데이터 타입으로 만들어 놓은 듯 하다. 행과 열로 이루어져 있어, 테이블의 형식으로 볼 수 있다. 

DataFrame 

Series들의 집합. 
여러개의 Series(행)이 모여 하나의 테이블형식의 데이터를 생성할 수 있다. 
행과 열이 있는 table 형태를 가진다. 


Series 

DataFrame의 한 컬럼 데이터세트. 
Series 역시 DataFrame의 인덱스와 동일한 인덱스를 가진다.  
Series는 테이블 형식의 데이터로 봤을때 하나의 레코드 즉, 행 값으로 생각하면 된다. 

=> 즉, Series는 컬럼이 하나인 데이터 구조체이고, DataFrame은 컬럼이 여러개인 데이터 구조체이다.


▼전체 코드 보기

더보기

-jupyter notebook

 

 

In [1]:
from IPython.core.display import display, HTML

display(HTML("<style> .container{width:90% !important;}</style>"))
 
 
 

이 jupyter는 'heannim-world.tistory.com'에서 가져왔습니다. 퍼가실 때 출처표시와 댓글 남겨주세요.

 

----------------------- pandas 기초 ---------------------------

 

1. Series

DataFrame의 한 컬럼 데이터세트

Series 역시 DataFrame의 인덱스와 동일한 인덱스를 가진다.

즉, Series는 컬럼이 하나인 데이터 구조체이고, DataFrame은 컬럼이 여러개인 데이터 구조체이다.

 

Series는 어떻게 생겼나?

In [2]:
#기본 수입
import pandas as pd
In [3]:
#Series는 Dataframe의 하나의 열이다.
age_in = pd.Series([22,23,44,55,28])
age_in
Out[3]:
0    22
1    23
2    44
3    55
4    28
dtype: int64
 

리스트는 딕셔너리와 달리 key값이 없는 순서형 자료형이므로, 인덱스는 자동으로 0부터 부여된다.

 

여러가지 메소드를 배워보자.

보통 이런식의 메소드들은 검색만 하게 된다. 최대한 반복학습으로 외울 수 있게 해보자.

 

1) index, keys, values

In [4]:
#인덱스를 접근하는 방법(아주 중요!!구글링해도 안나옴....)
#rangeIndex : 기본 인덱스 범위가 안정해졌을때 알아서 지정해준 그 인덱스의 범위를 표시해준다.
age_in.index
Out[4]:
RangeIndex(start=0, stop=5, step=1)
In [5]:
#값을 나타내는 방법
age_in.values
Out[5]:
array([22, 23, 44, 55, 28])
In [6]:
# 키 함수(=index와 같다)
age_in.keys()
Out[6]:
RangeIndex(start=0, stop=5, step=1)
In [7]:
#Series.index와 같이 인덱스가 가지고 있는 key값을 반환
print(age_in.keys)
 
<bound method Series.keys of 0    22
1    23
2    44
3    55
4    28
dtype: int64>
 

컬럼(세로) 부여하기

In [8]:
#시리즈 생성하기
age_in = pd.Series([22,33,44,55,28], index = ['가','나','다','라','마'])
age_in
Out[8]:
가    22
나    33
다    44
라    55
마    28
dtype: int64
In [9]:
#index를 사용해서 Series에 접근할 수 있다.
age_in['다']=100 #'다' 값 바꾸기
age_in
Out[9]:
가     22
나     33
다    100
라     55
마     28
dtype: int64
 

아래 둘이 의미하는 바가 같다.

In [10]:
#인덱스 보여줘
age_in.keys()
Out[10]:
Index(['가', '나', '다', '라', '마'], dtype='object')
In [11]:
#인덱스 보여줘
age_in.index
Out[11]:
Index(['가', '나', '다', '라', '마'], dtype='object')
 

 

dataframe만들기

In [12]:
srs = pd.Series(['가','나','다'], index = ['a','b','a'])
In [13]:
srs
Out[13]:
a    가
b    나
a    다
dtype: object
In [14]:
#인덱스 보여줘
print(srs.index)
 
Index(['a', 'b', 'a'], dtype='object')
In [15]:
#인덱스 보여줘
print(srs.keys())
 
Index(['a', 'b', 'a'], dtype='object')
In [16]:
# 키에 따른 값까지 반환
print(srs.keys)
 
<bound method Series.keys of a    가
b    나
a    다
dtype: object>
In [17]:
#index 번호로 출력하기
print(srs[0])
print(srs[1])
print(srs[2])
 
가
나
다
In [18]:
#-1은 맨 끝에를 의미한다.
print(srs[-1])
 
In [19]:
#데이터프레임 생성
df = pd.DataFrame(
    [
        [1,2,3],
        [4,5,6],
        [7,8,9]
    ], 
)
In [20]:
df
Out[20]:
  0 1 2
0 1 2 3
1 4 5 6
2 7 8 9
In [21]:
#시리즈 생성(모양을 비교해보자.)
ss = pd.Series([1,2,3,4,5,6])
In [22]:
ss
Out[22]:
0    1
1    2
2    3
3    4
4    5
5    6
dtype: int64
 

Series는 dataframe의 한 열이다.

 

 

2) array, type

 

numpy의 Array를 사용해서 시리즈로 생성하기

In [23]:
#11,22,33의 값을 numpy로 생성해서 시리즈로 대입해보기
listv = [11,22,33]
In [24]:
s1 = pd.Series(listv)
In [25]:
s1
Out[25]:
0    11
1    22
2    33
dtype: int64
 

이걸 numpy array로 바꾸면?

In [26]:
# numpy array는 Series의 값으로 대입
import numpy as np
n1 = np.array(listv)
In [27]:
n1
Out[27]:
array([11, 22, 33])
In [28]:
#array와 list의 차이(쉼표)
print(listv)
 
[11, 22, 33]
In [29]:
print(n1)
 
[11 22 33]
In [30]:
#각각의 type은?
print(type(listv))
 
<class 'list'>
In [31]:
print(type(n1)) #numpy에서 제공하는 array 타입이다.
 
<class 'numpy.ndarray'>
 

3) dictionary

 

딕셔너리를 시리즈 형태로 변환(중요)

In [32]:
info_list = {'kim' : 25, 'park' : 22, 'lee' : 34} #json 형태
info_series = pd.Series(info_list)
info_series
Out[32]:
kim     25
park    22
lee     34
dtype: int64
 

제이슨 형태를 list로 받아올 수 있음.

In [33]:
# 딕셔너리의 키값이 시리즈의 인덱스값이 된다.
info_series.index
Out[33]:
Index(['kim', 'park', 'lee'], dtype='object')
In [34]:
# 값들
info_series.values
Out[34]:
array([25, 22, 34])
In [35]:
# 키값으로 변환
info_series['lee'] = 100
print(info_series)
 
kim      25
park     22
lee     100
dtype: int64
In [36]:
#딕셔너리일 경우, 키값이 시리즈의 인덱스로 설정되어 있기 때문에
#시리즈를 생성할 때 새로운 인덱스를 부여하면 
#그 인덱스에 새로운 키로 생성 ->NaN
info_series = pd.Series(info_list, index=[0,1,2])
info_series
Out[36]:
0   NaN
1   NaN
2   NaN
dtype: float64
 

즉, 원래 있던 값이 아닌 앞에꺼가 지워지고 같은 이름의 새로운게 만들어지고, 거기에 값을 부여하지 않는 형태가 됨

In [37]:
# 다시 원래대로 값 넣고
info_series = pd.Series(info_list)
info_series
Out[37]:
kim     25
park    22
lee     34
dtype: int64
In [38]:
#인덱스 변경
info_series.index = ['A','B','C']
info_series
Out[38]:
A    25
B    22
C    34
dtype: int64
 

 

4) tuple

 

튜플 : 같은 값의 index가 가능하다.(중복가능)

In [39]:
#튜플은 둥근괄호
mytuple = (10,20,30)
mytuple
Out[39]:
(10, 20, 30)
In [40]:
#시리즈로 만들기
my_s = pd.Series(mytuple)
my_s
Out[40]:
0    10
1    20
2    30
dtype: int64
In [41]:
#인덱스 부여하기
my_s = pd.Series(mytuple, index=['A','B','C'])
my_s
Out[41]:
A    10
B    20
C    30
dtype: int64
 

 

5) mean

 

pandas를 사용해야 하는 이유

In [42]:
odd = [1, 3, 5, 7, 9]

type(odd) #타입?
Out[42]:
list
In [43]:
#평균 구하기
np.mean(odd)
Out[43]:
5.0
 

numpy에서 평균을 구하는 수식을 지원한다. 이걸 시리즈에 담아서도 할 수 있다!

In [44]:
odd2 = pd.Series(odd)
odd2
Out[44]:
0    1
1    3
2    5
3    7
4    9
dtype: int64
In [45]:
odd2.mean()
Out[45]:
5.0
 

 

2. pandas

Series, DataFrame 등의 자료구조를 활용해서 데이터 분석용 빅데이터를 더욱 빠른속도로 처리한다.

csv 파일 읽기, 엑셀파일보다 빠른 처리, RPA의 근간이 되는 모듈이다.

In [46]:
import numpy as np
import pandas as pd
In [47]:
#딕셔너리 만들기
dicts = {
    "a" : [5,6,7],    #이거 한줄이 시리즈가 될 수 있다.
    "b" : [8,9,10],
    "c" : ['2018','2019','2020'],
    "d" : [1.,2.,3.]    #소수점 표시하면 뒤에 0이 붙는다.
}

dicts
Out[47]:
{'a': [5, 6, 7],
 'b': [8, 9, 10],
 'c': ['2018', '2019', '2020'],
 'd': [1.0, 2.0, 3.0]}
In [48]:
#데이터 프레임 생성
df = pd.DataFrame(dicts,index=[1,2,3])
df
Out[48]:
  a b c d
1 5 8 2018 1.0
2 6 9 2019 2.0
3 7 10 2020 3.0
 

6) dtypes

In [49]:
#각각의 타입을 보면
df.dtypes
Out[49]:
a      int64
b      int64
c     object
d    float64
dtype: object
 

각각 숫자, c는 object(정수,실수, 문자형 등등을 전부 포함하는 가장 상위 자료형), d는 실수형이다.

In [50]:
#print 하면 약간 형태가 다르다.
print(df)
 
   a   b     c    d
1  5   8  2018  1.0
2  6   9  2019  2.0
3  7  10  2020  3.0
 

아무것도 안하고 출력하면 알아서 파이썬이 이쁘게 표로 나타내준다. print는 말 그대로 출력만

In [51]:
#이 데이터프레임의 정보를 보자. 
#인덱스3개, 항목 1~3, 총 4개의 컬럼과 빈값 없음. type에서 보았던 자료형들까지.
df.info()
 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 3 entries, 1 to 3
Data columns (total 4 columns):
a    3 non-null int64
b    3 non-null int64
c    3 non-null object
d    3 non-null float64
dtypes: float64(1), int64(2), object(1)
memory usage: 120.0+ bytes
In [52]:
#컬럼명으로 출력해보자.
print(df.a)
 
1    5
2    6
3    7
Name: a, dtype: int64
In [53]:
print(df.c)
 
1    2018
2    2019
3    2020
Name: c, dtype: object
In [54]:
#컬럼명을 문자열로(배열의 한 문자열로) 출력
print(df['a'])
 
1    5
2    6
3    7
Name: a, dtype: int64
In [55]:
#인덱스 자체를 리스트로 부여해서 가져오자
idx_list=["a","b"]
df[idx_list]
Out[55]:
  a b
1 5 8
2 6 9
3 7 10
In [56]:
idx_list=["a","b","c","d"]
df[idx_list]
Out[56]:
  a b c d
1 5 8 2018 1.0
2 6 9 2019 2.0
3 7 10 2020 3.0
In [57]:
#컬럼으로 배열 형태로 가져오자
column = ["a","b","c"]
In [58]:
#값들도 2차원 데이터(행렬데이터)로 Dataframe 생성해서 가져오자.(배열 속 배열 : 2차원 배열)
cc = [[5,6,7],[8,9,10],['2018','2019','2020']]
In [59]:
# cc를 데이터 프레임으로 만든걸 df_c에 저장
df_c = pd.DataFrame(cc)
In [60]:
df_c
Out[60]:
  0 1 2
0 5 6 7
1 8 9 10
2 2018 2019 2020
In [61]:
#인덱스(세로 : 가로줄 하나하나를 묶음)와 컬럼(가로 : 세로줄 하나하나를 묶음)도 부여해주자
df_c = pd.DataFrame(cc, index=[1,2,3], columns=column)
df_c
Out[61]:
  a b c
1 5 6 7
2 8 9 10
3 2018 2019 2020
 

------------ 헷갈리는 것 : index와 column ----------------

 

index(행) :가로로 한줄한줄 의미

column(열):세로로 한줄한줄 의미

각각의 이름을 붙여준다면 index=[세로를 대표] column=[가로를 대표]

 

 

7) arrange, reshape

 

numpy를 이용해서 변수값을 선언한 후에 데이터프레임으로 변경해서 같은 결과가 나오도록 구현해보기

In [62]:
import numpy as np
#arrage : 범위 안 정수 출력 (5부터 14까지)
a = np.arange(5,14)
a
Out[62]:
array([ 5,  6,  7,  8,  9, 10, 11, 12, 13])
In [63]:
#reshape : 배열로 3x3 모양을 만든다.
b = np.array(a).reshape(3,3)
b
Out[63]:
array([[ 5,  6,  7],
       [ 8,  9, 10],
       [11, 12, 13]])
In [64]:
df = pd.DataFrame(b, index=[1,2,3], columns=["a","b","c"])
df
Out[64]:
  a b c
1 5 6 7
2 8 9 10
3 11 12 13
 

reshape()는 다차원으로 변형이 가능하다. 괄호에 3x3 형태로 하겠다는 표시를 남기자

 

 

8) 비교연산자

 

dataframe은 비교연산자 사용 가능하다.

In [65]:
df
Out[65]:
  a b c
1 5 6 7
2 8 9 10
3 11 12 13
In [66]:
a
Out[66]:
array([ 5,  6,  7,  8,  9, 10, 11, 12, 13])
In [67]:
df.a #a행
Out[67]:
1     5
2     8
3    11
Name: a, dtype: int64
In [68]:
# df.a의 값이 특정 기준 8 인 데이터 프레임 가져오기(행)
print(df[df.a == 8])
 
   a  b   c
2  8  9  10
In [69]:
# 8이 아닌것
print(df[df.a != 8])
 
    a   b   c
1   5   6   7
3  11  12  13
In [70]:
b
Out[70]:
array([[ 5,  6,  7],
       [ 8,  9, 10],
       [11, 12, 13]])
In [71]:
df.b
Out[71]:
1     6
2     9
3    12
Name: b, dtype: int64
In [72]:
#df.b 칼럼에서 10보다 큰 값을 가져오기(행)
print(df[df.b > 10])
 
    a   b   c
3  11  12  13
In [73]:
# 없으면 그냥 확인만
df.b > 10
Out[73]:
1    False
2    False
3     True
Name: b, dtype: bool
In [74]:
#df.b 칼럼에서 10보다 큰 값을 가져오기(행)
if df[df.b > 20].empty:
   print("20이상 값 없음")
 
20이상 값 없음
In [75]:
#b열이 8보다 큰 경우만 뽑아줘
df[df['b']>8]
Out[75]:
  a b c
2 8 9 10
3 11 12 13
 

9) items(), generator

 

java의 IO -> stream

단방향이다. -> input

데이터가 지연될 수 있다.

list => 네트워크상에서 아이템의 값이 지연될 수 있다.

generator => 리스트의 단점을 극복해서 리스트와 같은 자연현상을 조금 최소화 할 수 있다.

In [76]:
# 키-값 쌍을 한 꺼번에 뽑아 내는 함수. generator 형식으로 뽑힌다.
df.items()
Out[76]:
<generator object DataFrame.iteritems at 0x7f76f42fa4f8>
 

반복문으로 items의 모든 값을 출력해보자

In [77]:
#column을 기준으로 Series의 values를 반환한다.
for label , content in df.items():
    print('label:',label)
    print('*'*10)
    print('content:')
    print(content)
 
label: a
**********
content:
1     5
2     8
3    11
Name: a, dtype: int64
label: b
**********
content:
1     6
2     9
3    12
Name: b, dtype: int64
label: c
**********
content:
1     7
2    10
3    13
Name: c, dtype: int64
In [78]:
for label , content in df.items():
    print(label)
    print(content)
 
a
1     5
2     8
3    11
Name: a, dtype: int64
b
1     6
2     9
3    12
Name: b, dtype: int64
c
1     7
2    10
3    13
Name: c, dtype: int64
 

 

10) drop_duplicates, shape, ndim

 

데이터 전처리(중복, null,NaN 등)

In [79]:
data = {
    'name' : ['홍길동','이철수','김영희','박민수','이철호','김영희'],
    'year' : [2014,2015,2016,2017,2018,2016],
    'point' : [1.5,1.7,3.9,2.4,2.9,3.9]
}
In [80]:
data
Out[80]:
{'name': ['홍길동', '이철수', '김영희', '박민수', '이철호', '김영희'],
 'year': [2014, 2015, 2016, 2017, 2018, 2016],
 'point': [1.5, 1.7, 3.9, 2.4, 2.9, 3.9]}
In [81]:
df = pd.DataFrame(data)
df
Out[81]:
  name year point
0 홍길동 2014 1.5
1 이철수 2015 1.7
2 김영희 2016 3.9
3 박민수 2017 2.4
4 이철호 2018 2.9
5 김영희 2016 3.9
In [82]:
#중복데이터 처리 (실제로는 사라지지 않음. 보여지기만 하는것.)
df.drop_duplicates()
Out[82]:
  name year point
0 홍길동 2014 1.5
1 이철수 2015 1.7
2 김영희 2016 3.9
3 박민수 2017 2.4
4 이철호 2018 2.9
In [83]:
#id로 확인해보면
id(df)
Out[83]:
140149611615344
In [84]:
id(df.drop_duplicates())
Out[84]:
140149611954072
 

둘이 값이 다르다.

 

이걸 바로 적용한다면?

In [85]:
#방법1. df 초기화(덮어쓰기)
df = df.drop_duplicates()
df
Out[85]:
  name year point
0 홍길동 2014 1.5
1 이철수 2015 1.7
2 김영희 2016 3.9
3 박민수 2017 2.4
4 이철호 2018 2.9
In [86]:
#방법2. 간지나게 속성부여해주기
df.drop_duplicates(inplace=True)
df
 
/home/kosmo_03/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  
Out[86]:
  name year point
0 홍길동 2014 1.5
1 이철수 2015 1.7
2 김영희 2016 3.9
3 박민수 2017 2.4
4 이철호 2018 2.9
In [87]:
# 데이터프레임에서의 값(내용) 출력
df.values
Out[87]:
array([['홍길동', 2014, 1.5],
       ['이철수', 2015, 1.7],
       ['김영희', 2016, 3.9],
       ['박민수', 2017, 2.4],
       ['이철호', 2018, 2.9]], dtype=object)
In [88]:
#데이터프레임 크기 -> 5x3 형태를 띈다.
df.shape
Out[88]:
(5, 3)
In [89]:
#차원 출력하기 -> 2차원이라고 한다.
df.ndim
Out[89]:
2
 

 

겹치는 '김영희'를 빼고 새로운 데이터셋 생성

In [90]:
data = {
    'name' : ['홍길동','이철수','김영희','박민수','이철호'],
    'year' : [2014,2015,2016,2017,2018],
    'point' : [1.5,1.7,3.9,2.4,2.9]
}
In [91]:
data
Out[91]:
{'name': ['홍길동', '이철수', '김영희', '박민수', '이철호'],
 'year': [2014, 2015, 2016, 2017, 2018],
 'point': [1.5, 1.7, 3.9, 2.4, 2.9]}
In [92]:
#없는 column을 추가하면?
df = pd.DataFrame(data,columns=['year','name','point','penalty'],
                 index = ['one','two','three','four','five'])
df
Out[92]:
  year name point penalty
one 2014 홍길동 1.5 NaN
two 2015 이철수 1.7 NaN
three 2016 김영희 3.9 NaN
four 2017 박민수 2.4 NaN
five 2018 이철호 2.9 NaN
 

딕셔너리를 데이터프레임의 값으로 처리할 때 키값이 다를 경우, 또는 새로운 칼럼을 추가할 경우 그 값은 NaN 으로 처리된다.

In [93]:
#index 보기
df.index
Out[93]:
Index(['one', 'two', 'three', 'four', 'five'], dtype='object')
In [94]:
# index와 column을 제외한 값들 보기
df.values
Out[94]:
array([[2014, '홍길동', 1.5, nan],
       [2015, '이철수', 1.7, nan],
       [2016, '김영희', 3.9, nan],
       [2017, '박민수', 2.4, nan],
       [2018, '이철호', 2.9, nan]], dtype=object)
In [95]:
# NaN 값 통일해서 채워넣기
df.penalty = 0.7
df
Out[95]:
  year name point penalty
one 2014 홍길동 1.5 0.7
two 2015 이철수 1.7 0.7
three 2016 김영희 3.9 0.7
four 2017 박민수 2.4 0.7
five 2018 이철호 2.9 0.7
In [96]:
#옆에 칼럼 값의 데이터로 각각 연산할 수도 있다.
df['penalty'] = df['point'] -1.0 #패널티는 포인트에서 1을 뺀 것.
df
Out[96]:
  year name point penalty
one 2014 홍길동 1.5 0.5
two 2015 이철수 1.7 0.7
three 2016 김영희 3.9 2.9
four 2017 박민수 2.4 1.4
five 2018 이철호 2.9 1.9
In [97]:
#외부에서 리스트로 데이터 값 변경
df['penalty'] = [0.5,0.7,0.9,1.0,0.6]
df
Out[97]:
  year name point penalty
one 2014 홍길동 1.5 0.5
two 2015 이철수 1.7 0.7
three 2016 김영희 3.9 0.9
four 2017 박민수 2.4 1.0
five 2018 이철호 2.9 0.6
In [98]:
#새로운 컬럼의 데이터 추가
df['age'] = [10,20,30,24,15]
df
Out[98]:
  year name point penalty age
one 2014 홍길동 1.5 0.5 10
two 2015 이철수 1.7 0.7 20
three 2016 김영희 3.9 0.9 30
four 2017 박민수 2.4 1.0 24
five 2018 이철호 2.9 0.6 15
 

 

연습문제 1 : 급여를 ( 평균나이 x 100000(십만) * penalty ) 로 연산해서 pay란 컬럼으로 생성하시오.

In [99]:
penalty =  np.mean(df['age'])
df['pay'] = df['age'] * 100000 * penalty
df
Out[99]:
  year name point penalty age pay
one 2014 홍길동 1.5 0.5 10 19800000.0
two 2015 이철수 1.7 0.7 20 39600000.0
three 2016 김영희 3.9 0.9 30 59400000.0
four 2017 박민수 2.4 1.0 24 47520000.0
five 2018 이철호 2.9 0.6 15 29700000.0
 

연습문제2 : age 컬럼에서 나이가 19세 이상이면 성년 , 이하이면 미성년으로 구분해서 df['division'] 이란 컬럼으로 저장하시오.

In [100]:
dv = []
for a in df['age']:
    if a >=19:
        dv.append("성년")
    else:
        dv.append("미성년")

print(dv)
 
['미성년', '성년', '성년', '성년', '미성년']
In [101]:
df['division'] = dv
df
Out[101]:
  year name point penalty age pay division
one 2014 홍길동 1.5 0.5 10 19800000.0 미성년
two 2015 이철수 1.7 0.7 20 39600000.0 성년
three 2016 김영희 3.9 0.9 30 59400000.0 성년
four 2017 박민수 2.4 1.0 24 47520000.0 성년
five 2018 이철호 2.9 0.6 15 29700000.0 미성년
 

 

11) del, loc, iloc

In [102]:
# 컬럼 삭제 : del
del df['age']
del df['division']
In [103]:
df
Out[103]:
  year name point penalty pay
one 2014 홍길동 1.5 0.5 19800000.0
two 2015 이철수 1.7 0.7 39600000.0
three 2016 김영희 3.9 0.9 59400000.0
four 2017 박민수 2.4 1.0 47520000.0
five 2018 이철호 2.9 0.6 29700000.0
In [104]:
# loc : 레이블을 기반으로 인덱싱
# 특정 행을 출력, loc[행범위, 열범위]
df.loc
Out[104]:
<pandas.core.indexing._LocIndexer at 0x7f76f3fb4688>
In [105]:
#two에 해당하는 행을 출력한다.
df.loc["two"]
Out[105]:
year           2015
name            이철수
point           1.7
penalty         0.7
pay        3.96e+07
Name: two, dtype: object
In [106]:
#two~four 구간 출력
df.loc["two":"four"]
Out[106]:
  year name point penalty pay
two 2015 이철수 1.7 0.7 39600000.0
three 2016 김영희 3.9 0.9 59400000.0
four 2017 박민수 2.4 1.0 47520000.0
In [107]:
#전체구간에서 year와 name만 꺼내오기
df.loc[:,['year','name']]
Out[107]:
  year name
one 2014 홍길동
two 2015 이철수
three 2016 김영희
four 2017 박민수
five 2018 이철호
In [108]:
df
Out[108]:
  year name point penalty pay
one 2014 홍길동 1.5 0.5 19800000.0
two 2015 이철수 1.7 0.7 39600000.0
three 2016 김영희 3.9 0.9 59400000.0
four 2017 박민수 2.4 1.0 47520000.0
five 2018 이철호 2.9 0.6 29700000.0
In [109]:
#정수기반으로 위치(인덱스번호)를 인덱싱
#0부터 3번째
df.iloc[3]
Out[109]:
year            2017
name             박민수
point            2.4
penalty            1
pay        4.752e+07
Name: four, dtype: object
In [110]:
# df.iloc[행범위, 열범위] start:end => end는 -1 한 곳까지다.
df.iloc[3:5,0:2]
Out[110]:
  year name
four 2017 박민수
five 2018 이철호
In [111]:
# 전체 행에서 1~3열을 출력 => iloc 사용
df.iloc[:,1:4]
Out[111]:
  name point penalty
one 홍길동 1.5 0.5
two 이철수 1.7 0.7
three 김영희 3.9 0.9
four 박민수 2.4 1.0
five 이철호 2.9 0.6
In [112]:
#특정값을 찾을 때(인덱스번호로 0부터 1,1자리)
df.iloc[1,1]
Out[112]:
'이철수'
In [ ]:
 

 

jupyter notebook-


 

 

반응형
LIST

댓글