2018. 7. 16. 03:27ㆍPython-이론/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 접두사 | 설명 | 사용 예 |
---|---|---|
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 | Syntax | Result |
---|---|---|
Select column | df[col] | Series |
Select row by label | df.loc[label] | Series |
Select row by integer location | df.iloc[loc] | Series |
Slice rows | df[5:10] | DataFrame |
Select rows by boolean vector | df[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: int32r = 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)
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해 줄 수 있다.
'Python-이론 > python' 카테고리의 다른 글
python에서 tinyDB사용하기 (0) | 2018.04.15 |
---|---|
파이썬에서 mysql사용하기 (0) | 2018.04.15 |
python에서 SqLite사용하기 (0) | 2018.04.15 |
링크에 있는 것을 한꺼번에 다운 받기 (0) | 2018.03.14 |
파이썬 프로그래밍의 기초: 외부함수 (0) | 2018.02.05 |