# Pandas
# - 고수준의 자료구조(Series, DataFrame)와 빠르고 쉬운 데이터 분석용 자료구조 및 함수를 제공한다.
# - NumPy의 고성능 배열 계산 기능과 스프레드시트
# - SQL과 같은 RDMBS의 유연한 데이터 조작 기능을 갖고 있다.
# - 세련된 인덱싱 기능으로 쉽게 데이터를 재배치하여 집계 등의 처리를 편리하게 한다.
import pandas as pd
from pandas import Series, DataFrame
import numpy as np
# Series는 일련의 객체를 담을 수 있는 1차원 배열과 같은 구조로 색인을 갖는다.
obj = Series([3, 7, -5, 4])
# obj = Series((3, 7, -5, 4))
# obj = Series({3, 7, -5, 4}) # TypeError : 'set' type is unordered. 순서가 없기 때문에 사용 불가능
print(obj, type(obj))
obj2 = Series([3, 7, -5, 4], index = ['a', 'b', 'c', 'd'])
print(obj2)
print(obj2.sum(), ' ', np.sum(obj2), ' ', sum(obj2))
# pandas, numpy, python 순서대로의 함수이다.
print(obj2.mean(), obj2.std())
print()
print(obj2.values) # 배열로 반환한다.
print(obj2.index) # 인덱싱으로 반환한다.
print()
print(obj2[0], obj2['a'], ' ', obj2[['a']]) # 숫자를 문자화해서 호출 가능
print(obj2['a':'b']) # 슬라이싱
print(obj2[['a','b']]) # 인덱싱
print(obj2[1:4])
print(obj2[[2,1]])
print(obj2 > 0)
print('a' in obj2) # 'a'가 obj2에 들어있는가, true를 반환
print('dict로 Series 객체 생성')
names = {'mouse':5000, 'keyboard':25000, 'monitor':'350000'}
obj3 = Series(names)
print(obj3) # dict 타입은 순서는 없지만 키 벨류값이기 때문에 가능하다.
obj3.index = ['마우스','키보드','모니터']
print(obj3)
print()
obj3.name = '상품가격'
print(obj3)
# DataFrame :
# 표 모양(2차원 형태 차료)의 자료구조로 여러 개의 칼럼을 갖는다. (Series가 모인 형태)
# 각 칼럼은 서로 다른 종류의 값을 기억할 수 있다.
print()
df = DataFrame(obj3) # Series로 DataFrame 객체 생성.
print(df)
# 같은 길이의 리스트에 담긴 dict type의 데이터를 이용해 DataFrame 객체 생성.
print()
data = {
'irum':['홍길동', '한국인', '신기해', '공기밥', '한가해'],
'juso':('역삼동', '신당동', '역삼동', '역삼동', '신사동'),
'nai':[23, 25, 33, 30, 35],
}
print(data)
frame = pd.DataFrame(data)
print(frame, type(frame))
print(frame['irum']) # irum만 호출
print(frame.irum, type(frame.irum)) # irum만 호출, Series type
print()
print('열 순서 변경')
print(DataFrame(data, columns = ['juso', 'irum', 'nai']))
print()
frame2 = DataFrame(data, columns = ['juso', 'irum', 'nai', 'tel'], index = ['a', 'b', 'c', 'd', 'e'])
print(frame2) # tel은 value 값이 없으므로 NaN으로 표시된다.
frame2['tel'] = '111-1111' # 모든 행에 적용
print(frame2)
val = Series(['222-2222', '333-3333', '444-2222'], index = ['b', 'c', 'd'])
frame2['tel'] = val # b, c, d만 적용
print(frame2)
print()
print(frame2.T) # transpose, 행과 열의 위치를 바꾼다.
print(frame.values) # 2차원으로 결과가 반환된다.
print(frame.values[0,1]) # 0행 1열 값을 호출
print(frame.values[0:2]) # 0행과 1행 값을 2차원으로 호출
print()
frame3 = frame2.drop('d') # axis = 0, d행 삭제
print(frame3)
frame4 = frame2.drop('tel', axis = 1) # 열 방향은 무조건 axis를 넣어주어야 된다.
print(frame4)
print()
print(frame2)
# index명/열이름으로 정렬
print(frame2.sort_index(axis=0, ascending=False)) # 내림차순(ascending=False)
print()
print(frame2.sort_index(axis=1, ascending=False)) # 오른차순(ascending=True)
print()
print(frame2.rank(axis=0)) # 사전순으로 순위를 매길 수도 있다.
print()
print(frame2['juso'].value_counts())
print()
data = {
'juso':['강남구 역삼동', '중구 신당동', '강남구 대치동'],
'inwon':[23, 25, 15]
}
fr = DataFrame(data)
print(fr)
result1 = Series([x.split()[0] for x in fr.juso])
result2 = Series([x.split()[1] for x in fr.juso])
print(result1)
print(result2)
print(result1.value_counts())
<console>
0 3
1 7
2 -5
3 4
dtype: int64 <class 'pandas.core.series.Series'>
a 3
b 7
c -5
d 4
dtype: int64
9 9 9
2.25 5.123475382979799
[ 3 7 -5 4]
Index(['a', 'b', 'c', 'd'], dtype='object')
3 3 a 3
dtype: int64
a 3
b 7
dtype: int64
a 3
b 7
dtype: int64
b 7
c -5
d 4
dtype: int64
c -5
b 7
dtype: int64
a True
b True
c False
d True
dtype: bool
True
dict로 Series 객체 생성
mouse 5000
keyboard 25000
monitor 350000
dtype: object
마우스 5000
키보드 25000
모니터 350000
dtype: object
마우스 5000
키보드 25000
모니터 350000
Name: 상품가격, dtype: object
상품가격
마우스 5000
키보드 25000
모니터 350000
{'irum': ['홍길동', '한국인', '신기해', '공기밥', '한가해'], 'juso': ('역삼동', '신당동', '역삼동', '역삼동', '신사동'), 'nai': [23, 25, 33, 30, 35]}
irum juso nai
0 홍길동 역삼동 23
1 한국인 신당동 25
2 신기해 역삼동 33
3 공기밥 역삼동 30
4 한가해 신사동 35 <class 'pandas.core.frame.DataFrame'>
0 홍길동
1 한국인
2 신기해
3 공기밥
4 한가해
Name: irum, dtype: object
0 홍길동
1 한국인
2 신기해
3 공기밥
4 한가해
Name: irum, dtype: object <class 'pandas.core.series.Series'>
열 순서 변경
juso irum nai
0 역삼동 홍길동 23
1 신당동 한국인 25
2 역삼동 신기해 33
3 역삼동 공기밥 30
4 신사동 한가해 35
juso irum nai tel
a 역삼동 홍길동 23 NaN
b 신당동 한국인 25 NaN
c 역삼동 신기해 33 NaN
d 역삼동 공기밥 30 NaN
e 신사동 한가해 35 NaN
juso irum nai tel
a 역삼동 홍길동 23 111-1111
b 신당동 한국인 25 111-1111
c 역삼동 신기해 33 111-1111
d 역삼동 공기밥 30 111-1111
e 신사동 한가해 35 111-1111
juso irum nai tel
a 역삼동 홍길동 23 NaN
b 신당동 한국인 25 222-2222
c 역삼동 신기해 33 333-3333
d 역삼동 공기밥 30 444-2222
e 신사동 한가해 35 NaN
a b c d e
juso 역삼동 신당동 역삼동 역삼동 신사동
irum 홍길동 한국인 신기해 공기밥 한가해
nai 23 25 33 30 35
tel NaN 222-2222 333-3333 444-2222 NaN
[['홍길동' '역삼동' 23]
['한국인' '신당동' 25]
['신기해' '역삼동' 33]
['공기밥' '역삼동' 30]
['한가해' '신사동' 35]]
역삼동
[['홍길동' '역삼동' 23]
['한국인' '신당동' 25]]
juso irum nai tel
a 역삼동 홍길동 23 NaN
b 신당동 한국인 25 222-2222
c 역삼동 신기해 33 333-3333
e 신사동 한가해 35 NaN
juso irum nai
a 역삼동 홍길동 23
b 신당동 한국인 25
c 역삼동 신기해 33
d 역삼동 공기밥 30
e 신사동 한가해 35
juso irum nai tel
a 역삼동 홍길동 23 NaN
b 신당동 한국인 25 222-2222
c 역삼동 신기해 33 333-3333
d 역삼동 공기밥 30 444-2222
e 신사동 한가해 35 NaN
juso irum nai tel
e 신사동 한가해 35 NaN
d 역삼동 공기밥 30 444-2222
c 역삼동 신기해 33 333-3333
b 신당동 한국인 25 222-2222
a 역삼동 홍길동 23 NaN
tel nai juso irum
a NaN 23 역삼동 홍길동
b 222-2222 25 신당동 한국인
c 333-3333 33 역삼동 신기해
d 444-2222 30 역삼동 공기밥
e NaN 35 신사동 한가해
juso irum nai tel
a 4.0 5.0 1.0 NaN
b 1.0 4.0 2.0 1.0
c 4.0 2.0 4.0 2.0
d 4.0 1.0 3.0 3.0
e 2.0 3.0 5.0 NaN
역삼동 3
신당동 1
신사동 1
Name: juso, dtype: int64
juso inwon
0 강남구 역삼동 23
1 중구 신당동 25
2 강남구 대치동 15
0 강남구
1 중구
2 강남구
dtype: object
0 역삼동
1 신당동
2 대치동
dtype: object
강남구 2
중구 1
dtype: int64