Python 데이터 분석

Python 데이터분석 기초 6 - Pandas(Series) 2차원, 배열

코딩탕탕 2022. 10. 31. 10:24

 

# 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