자주사용하는 모듈 pandas

2018. 7. 16. 03:27Python-이론/python

pandas


이번에는 인공지능을 하면서 자주사용하는 모듈중 하나인 pandas를 사용해보도록 하겠습니다. 


1. Series 


import pandas as pd 


모든 데이터 유형(정수, 문자열, 부동소수점, 파이썬객체 등)을 보유할 수 있는 일차원 레이블 배열입니다. 

축레이블을 인덱스(index)라고 합니다.


s = pd.Series(data, index=index) 

index는 옵션 

인덱스가 없으면 레이블을 0, 1, 2, 3으로 표현한다. 


 1. dictionary에서

data = {'a':1, 'b':2, 'c':3, 'd':4}

print(pd.Series(data)) output a 1 b 2 c 3 d 4 dtype: int64

2. array 

data = [0, 1, 2, 3, 4]

print(pd.Series(data, index=['a', 'b', 'c', 'd', 'e'])) a 0 b 1 c 2 d 3 e 4

3. 단일 값

print(pd.Series(5., index=['a', 'b', 'c', 'd', 'e']))
a    5.0
b    5.0
c    5.0
d    5.0
e    5.0
dtype: float64



Series를 한 값 들은 array나 dict와 비슷하게 사용할 수 있다. 수식도 사용할 수 있다.  


print(s[0:5])
print(s['a']) print(s.get('a'))

이런식으로 라벨이나 인덱스값으로 접근할 수 있다. 


print(s*2)
print(s+s)
print(np.exp(s))

곱하기 더하기 등을 사용해서 표현할 수 있다. 


s = pd.Series(data, index=['a', 'b', 'c', 'd', 'e'], name="alphabet") a 0 b 1 c 2 d 3 e 4 Name: alphabet, dtype: int64 s.name#alphabet s.rename('test') #바꿀 수 있다.

name 추가하기 


DataFrame

데이터를 2차원 배열로 바꾸어 반환해준다. 


pd.DataFrame(data)


data:

  • 1D array, list, Series, Dict 
  • 2D numpy.ndarray
  • A Series
  • Another DataFrame

import pandas as pd
import numpy as np
data = {
'one':pd.Series([0, 1, 2, 3], index=['a', 'b', 'c', 'd']),
'two':pd.Series([4, 5, 6, 7], index=['a', 'b', 'c', 'd'])
}

print(pd.DataFrame(data)) one two a 0 4 b 1 5 c 2 6 d 3 7 print(df.index) print(df.columns)
Index(['a', 'b', 'c', 'd'], dtype='object') Index(['one', 'two'], dtype='object')
dtype 옵션 추가하기 

dtype 접두사설명사용 예
b불리언b (참 혹은 거짓)
i정수i8 (64비트)
u부호 없는 정수u8 (64비트)
f부동소수점f8 (64비트)
c복소 부동소수점c16 (128비트)
O객체0 (객체에 대한 포인터)
S바이트 문자열S24 (24 글자)
U유니코드 문자열U24 (24 유니코드 글자)

data = np.zeros((2,), dtype=[('D','i4'), ('E','f4'), ('F','a10')])
data[:] = [(
1,2.,'Hello'), (2,3.,"World")]
print(data) [(1, 2., b'Hello') (2, 3., b'World')] print(pd.DataFrame) D E F 0 1 2.0 b'Hello' 1 2 3.0 b'World'

#change Index Value print(pd.DataFrame(data, index=['Hello', 'World']))

#칼럼 순서 바꿔서 출력하기 print(pd.DataFrame(data, columns=['F', 'D', 'E']))


리스트 안에 딕셔너리 추가해서 사용해보기 

data = [{'a':1, 'b':2}, {'a':1, 'b':2, 'c':3}]
print(pd.DataFrame(data)) a b c 0 1 2 NaN 1 1 2 3.0



대체 생성자


1. pd.DataFrame.from_dict

data = {
'one':pd.Series([0, 1, 2, 3], index=['a', 'b', 'c', 'd']),
'two':pd.Series([4, 5, 6, 7], index=['a', 'b', 'c', 'd'])
}
print(pd.DataFrame.from_dict(data)) one two a 0 4 b 1 5 c 2 6 d 3 7


2. pd.DataFrame.from_records

data = np.zeros((2,), dtype=[('D','i4'), ('E','f4'), ('F','a10')])
data[:] = [(
1,2.,'Hello'), (2,3.,"World")] print(pd.DataFrame.from_records(data, index='F')) D E F 0 1 2.0 b'Hello' 1 2 3.0 b'World' D E F b'Hello' 1 2.0 b'World' 2 3.0


colums selection, addition, deletion


Select 

data = np.zeros((2,), dtype=[('D','i4'), ('E','f4'), ('F','a10'), ('flag', 'b')])
data[:] = [(
1,2.,'Hello', False), (2,3.,"World", False)]
#select
data['A']
data[
'E'] = data['D'] * data['E']
data[
'flag'] = data['D'] > 0 D E F flag 0 1 2.0 b'Hello' 1 1 2 6.0 b'World' 1

Delete

v = pd.DataFrame(data)
del v['D']
v.pop('F')
print(v)

Insert

v['poo'] = 'bar'
v.insert(1, 'E2', v['E']) # 2번째 위치에 E2라는 칼럼으로 미리 존재하는 칼럼 E를 복사하여 넣는다
print(v) E E2 flag poo 0 2.0 2.0 1 bar 1 6.0 6.0 1 bar



Indexing, Selection 



Operation

SyntaxResult
Select columndf[col]Series
Select row by labeldf.loc[label]Series
Select row by integer locationdf.iloc[loc]Series
Slice rowsdf[5:10]DataFrame
Select rows by boolean vectordf[bool_vec]DataFrame


print(v.loc[1])
D              2
E2             6
E              6
F       b'World'
flag           1
poo          bar
Name: 1, dtype: object



데이터 정렬 및 산수 



import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randn(10, 4), columns=['A', 'B', 'C', 'D'])
df2 = pd.DataFrame(np.random.randn(7, 3), columns=['A', 'B', 'C'])
print(df2+df)

          A         B         C   D

0 -0.362819  1.637539 -0.693026 NaN

1  0.725845 -0.024171 -0.552981 NaN

2  2.546491  0.421357  1.244599 NaN

3 -0.332834  0.394929  0.804072 NaN

4 -1.995422  3.209772  0.248188 NaN

5 -2.447599  0.727244  1.096142 NaN

6  1.355332  1.390698  0.844427 NaN

7       NaN       NaN       NaN NaN

8       NaN       NaN       NaN NaN

9       NaN       NaN       NaN NaN


df가 0에서 9까지의 인덱스 값을 갖고 있지만 없는 데이터와 더해주면 Nan이 되는 것을 볼 수 있다. 

위에 서와 더한 것과 같이 숫자를 빼주거나 더하거나 나누거나 할 수 있다.


부울 연산자에서 사용해보기

df1 = pd.DataFrame({'a':[1, 0, 1], 'b':[0, 1, 1]}, dtype=bool)
df2 = pd.DataFrame({'a':[0, 1, 1], 'b':[1, 1, 0]}, dtype=bool)
print(df1 & df2)
print(df1 | df2)

       a      b

0  False  False

1  False   True

2   True  False

      a     b

0  True  True

1  True  True

2  True  True


전치행렬 해주기



df1 = pd.DataFrame({'a':[1, 0, 1], 'b':[0, 1, 1]}, dtype=bool)
df2 = pd.DataFrame({
'a':[0, 1, 1], 'b':[1, 1, 0]}, dtype=bool)
print(df1) print(df1.T) a b 0 True False 1 False True 2 True True #바뀐 행렬 0 1 2 a True False True b False True True



numpy 함수와 함께 사용하기 


sr = pd.Series(np.arange(5, 10))
print(sr) 0 5 1 6 2 7 3 8 4 9 dtype: int32
r = pd.Series(np.arange(5, 10))
print(sr.dot(sr)) 255


data colum 속성에 접근 


df = pd.DataFrame({'foo1':np.random.randn(5),
'foo2':np.random.randn(5)})

print(df) print(df.foo1)
foo1 foo2 0 0.150315 1.104175 1 0.746232 0.049420 2 1.711735 0.754402 3 -0.772761 -0.177448 4 -0.528977 -0.374209 0 0.150315 1 0.746232 2 1.711735 3 -0.772761 4 -0.528977 Name: foo1, dtype: float64



패널 


패널은 자주 사용되고 있지 않지만 3차원데이터를 다룰 때 자주 사용된다.

pan (el) -da (ta) -s. 3 축의 이름은 패널 데이터와 관련된 작업, 특히 패널 데이터의 계량 경제 분석을 설명하는 데 의미 적 의미를 부여하기위한 것입니다  

  • items: axis 0, each item corresponds to a DataFrame contained inside
  • major_axis: axis 1, it is the index (rows) of each of the DataFrames
  • minor_axis: axis 2, it is the columns of each of the DataFrames

Construction of Panels works about 


import pandas as pd
import numpy as np #items는 2에 major_axis는 5에 minor_axis는 4에 대응한다.
wp = pd.Panel(np.random.randn(2, 5, 4), items=['Item1', 'Item2'],
major_axis=pd.date_range('1/1/2000', periods=5),
minor_axis=['A', 'B', 'C', 'D'])
print(wp)

<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 5 (major_axis) x 4 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 2000-01-01 00:00:00 to 2000-01-05 00:00:00
Minor_axis axis: A to D



from_dict 


dict타입의 데이터를 활용해서 Panel데이터를 만드렁 보겠습니다. 


import pandas as pd
import numpy as np
data = {
'Item1':pd.DataFrame(np.random.randn(4, 3)),
'Item2':pd.DataFrame(np.random.randn(4, 2))} print(pd.Panel(data)) <class 'pandas.core.panel.Panel'> Dimensions: 2 (items) x 4 (major_axis) x 3 (minor_axis) Items axis: Item1 to Item2 Major_axis axis: 0 to 3 Minor_axis axis: 0 to 2 print(pd.Panel.from_dict(data, orient='minor')) <class 'pandas.core.panel.Panel'> Dimensions: 3 (items) x 4 (major_axis) x 2 (minor_axis) Items axis: 0 to 2 Major_axis axis: 0 to 3 Minor_axis axis: Item1 to Item2

orient 옵션은 colum이랑 orient에 입력된 특성의 값을 서로 바꾸어준다. 

이는 타입이 서로다르게 혼합된 데이터에 유용하게 사용할 수 있다. 



to_panel 


import pandas as pd
import numpy as np

midx = pd.MultiIndex(levels=[['one', 'two'], ['x', 'y']], labels = [[0,1,0,1],[1,0,1,0]])#0-> one 1 -> two
df = pd.DataFrame({'A':[1, 2, 3, 4], 'B':[5, 6, 7, 8]}, index=midx)
print(df) A B one y 1 5 two x 2 6 one y 3 7 two x 4 8


transpose


df.transpose(2, 0, 1)

이런식으로 rearrange해 줄 수 있다.