티스토리 뷰

반응형



DataFrame

  - Series의 집합

  - 서로 다른 데이터 타입을 갖는 column

  - Data Frame의 Key : column / Series의 Key : row를 의미



# 생성

%run profile

import pandas as pd

from pandas import Series, DataFrame


1. 한 번에 생성

fruits = DataFrame({'name':['apple','mango','banana','cherry'],

                    'price':[2000,150,500,400],

                    'qty':[5,4,10,NA]})

fruits

name        price qty

0 apple        2000 5.0

1 mango 150 4.0

2 banana 500 10.0

3 cherry 400 NaN


2. Dictionary 구조를 DataFrame으로

d1 = {'name':['apple','mango','banana','cherry'],

          'price':[2000,150,500,400],

          'qty':[5,4,10,NA]}

fruits = DataFrame(d1)

fruits

name       price qty

0 apple        2000 5.0

1 mango 150 4.0

2 banana 500 10.0

3 cherry 400 NaN




# 구조 확인 

fruits.dtypes   # column별 데이터 타입 확인

name      object

price      int64

qty      float64

dtype: object


fruits.index   # row 이름 확인

RangeIndex(start=0, stop=4, step=1)


fruits.columns   # column 이름 확인

Index(['name', 'price', 'qty'], dtype='object')


fruits.values   # value 확인 (array 구조로 return)

array([['apple', 2000, 5.0],

       ['mango', 150, 4.0],

       ['banana', 500, 10.0],

       ['cherry', 400, nan]], dtype=object)

 

len(fruits)

fruits.shape[0]    # row 개수

4


fruits.shape[1]    # columns 개수

3


 


# index(row) 설정

1. 특정 컬럼을 index로 설정

fruits = fruits.set_index('price')             # set_index 메서드는 특정 컬럼을 index로 설정 후 본문에서 제거       

                                                       # fruits.index = fruits['price'] 

                                                       # fruits = fruits.drop('price', axis = 1)


# index수정 시, 일부 수정이 불가하여 전체를 수정하는 듯이 수정해야 함

2. index의 크기가 작을 경우, index 모두 작성

fruits.index

RangeIndex(start=0, stop=4, step=1)

fruits.index = [10,2,3,4]

Int64Index([10, 2, 3, 4], dtype='int64')


3. index의 크기가 클 경우, 수정 가능한 list 구조로 변경 후 수정

ind_list = list(fruits.index)

ind_list[0] = 10

fruits.index = ind_list

Int64Index([10, 1, 2, 3], dtype='int64')



 

# 이름 설정

fruits.columns.name = 'type'     # column 이름

fruits

type name        price qty

0 apple        2000 5.0

1 mango 150 4.0

2 banana 500 10.0

3 cherry 400 NaN


fruits.index.name = 'num'      # row 이름

fruits 

type name       price qty

num

0 apple       2000 5.0

1 mango 150 4.0

2 banana 500 10.0

3 cherry 400 NaN


 

 

# 색인 

# loc[] for label based indexing or  # 그 외 색인

# iloc[] for positional indexing       # 정수 색인

fruits['name']    # columns 색인 

fruits.name

fruits.iloc[:,0]

fruits.loc[:,'name']

0     apple

1     mango

2    banana

3    cherry

Name: name, dtype: object

fruits[['name','qty']]

name        qty

0 apple         5.0

1 mango 4.0

2 banana 10.0

3 cherry NaN

fruits.loc[:,'name':'qty']

        name         price qty

0 apple   2000 5.0

1 mango 150 4.0

2 banana 500 10.0

3 cherry 400 NaN


fruits.iloc[0,:]    # row 색인

fruits.iloc[0]

name     apple

price     2000

qty          5

Name: 0, dtype: object


fruits.loc[0,'name']  # row, column

'apple'

fruits.iloc[[0,1],0]

0    apple

1    mango

Name: name, dtype: object

fruits.iloc[[0,1],[0,1]]

fruits.iloc[0:2,0:2]

name         price

0 apple         2000

1 mango 150




# 재색인 (reindex)

# 재정의가 아닌, 재배치 !!

# 원하는 순서로 DataFrame을 재색인 (새로운 객체 생성)

# 존재하지 않는 값 색인 시, 빈 값을 새로 추가

# 단, 위치기반 재색인은 불가 => iloc 메서드로

1. column reindex 

fruits.reindex(columns = ['price','qty','name'])

DataFrame(fruits, columns = ['price','qty','name'])

fruits.loc[:,['price','qty','name']]

fruits.iloc[:,[1,2,0]]

price    qty    name

0    2000    5.0    apple

1     150     4.0   mango

2     500    10.0  banana

3     400    NaN   cherry


2. row reindex

fruits.reindex([3,2,1,0])

DataFrame(fruits, index = [3,2,1,0])

        name         price qty

3 cherry 400 NaN

2 banana 500 10.0

1 mango 150 4.0

0 apple   2000 5.0


3. column/row reindex

fruits.reindex(index = [3,2,1,0], columns = ['price','qty','name'])

fruits.loc[[3,2,1,0],['price','qty','name']]

price    qty    name

3     400    NaN   cherry

2     500    10.0  banana

1     150     4.0   mango

0    2000    5.0    apple


4. 존재하지 않는 색인 값 지정

fruits.reindex(columns = ['price','qty','name', 'prefer'], fill_value = 0)   # 매칭되지 않는 색인 값을 0으로

      price    qty    name   prefer

0    2000    5.0    apple       0

1     150     4.0   mango     0

2     500    10.0  banana     0

3     400    NaN   cherry     0


fruits.reindex([3,2,1,0,4], fill_value = 0)

        name         price qty

3 cherry 400 NaN

2 banana 500 10.0

1 mango 150 4.0

0 apple   2000 5.0

4            0            0   0.0


s1 = Series([1,2,3], index = [0,2,4])

s1.reindex([0,1,2,3,4,5])  

0 1.0 1 NaN 2 2.0 3 NaN 4 3.0 5 NaN dtype: float64

s1.reindex([0,1,2,3,4,5], method = 'ffill')     # 매칭되지 않는 값을 앞or뒤 데이터로 채우기 (ffill : 앞, bfill : 뒤)

0    1

1    1

2    2

3    2

4    3

5    3

dtype: int64




# column 추가

fruits['group'] = Series([1,2,2,1])

fruits.loc[:,'group'] = Series([1,2,2,1])

name price qty group

0 apple 2000 5.0 1

1 mango 150 4.0 2

2 banana 500 10.0 2

3 cherry 400 NaN 1

 

  

  

# column 삭제

fruits.drop('group', axis = 1)

del fruits['group']

   name       price qty

0 apple        2000 5.0

1 mango 150 4.0

2 banana 500 10.0

3 cherry 400 NaN



# row 추가

fruits.loc[fruits.shape[0]] = ['melon',800,8]

   name       price qty

0 apple        2000 5.0

1 mango 150 4.0

2 banana 500 10.0

3 cherry 400 NaN

4      melon        800    8.0




# row 삭제

fruits.drop(4)

   name       price qty

0 apple        2000 5.0

1 mango 150 4.0

2 banana 500 10.0

3 cherry 400 NaN





#. Q1

fruits = DataFrame({'name':['apple','mango','banana','cherry'],

                    'price':[2000,150,500,400],

                    'qty':[5,4,10,NA]})

fruits.dtypes

name      object

price      int64

qty      float64

dtype: object

fruits.index = fruits['name']

fruits.iloc[:,1:3]

fruits = fruits.iloc[:,1:3]

fruits

 

### 1) qty의 평균

fruits['qty'].mean()  

fruits.qty.mean()  

6.333333333333333


### 2) price가 1000 이상인 과일 이름 출력

fruits[fruits['price'] >= 1000]

fruits.loc[fruits['price'] >= 1000, :].index

Index(['apple'], dtype='object', name='name')

 

### 3) cherry, banana, mango, apple 순 출력

fruits.reindex(['cherry','banana','mango','apple'])


### 4) 세 번째 row에 추가 peach 추가 (price : 2500, qty : 3)

fruits = fruits.reindex(['cherry','banana','mango','apple','peach'])

fruits.iloc[4,0] = 2500

fruits.iloc[4,1] = 3

fruits.price = fruits.price.astype('int')

### 5) qty -> QTY 수정

col_list = list(fruits.columns)

col_list[1] = 'QTY'

fruits.columns = col_list

fruits

 



반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday