티스토리 뷰
DataFrame
- Series의 집합
- 서로 다른 데이터 타입을 갖는 column
- Data Frame의 Key : column / Series의 Key : row를 의미
# 생성
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
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
'Python > Process' 카테고리의 다른 글
[Python] Pandas - DataFrame 관련 메서드 (0) | 2019.02.11 |
---|---|
[Python] DataFrame 그룹 함수 적용 - map,apply,applymap (0) | 2019.02.10 |
[Python] profile 만들기 (import를 한 번에) (0) | 2019.02.07 |
[Python] Pandas - Series (0) | 2019.02.07 |
[Python] NA, NaN, Null (1) | 2019.02.07 |