-- 02.pandas.opynb--
panel data and analysis
공식: https://pandas.pydata.org
![]()
import numpy as np
import pandas as pd
s1 = pd.Series([10, 20, 30])
s1
s1.values
s1.index
s1.dtype
s3 = pd.Series(np.arange(200))
s3
s3[4]
s4 = pd.Series([1, 2, 3], [100, 200, 300])
s4
s4[100]
s4.index
s5 = pd.Series([1, 2, 3], ['john', 'mark', 'charlie'])
s5
s5['john']
s6 = pd.Series([1, 2, 3], ['john', 'john', 'charlie'])
s6
s6['john'] # 결과 Series!!!
sdata = {'김철수': 35000, '이상현': 67000, '최종수': 12000, '박진관': 4000}
s6 = pd.Series(sdata)
s6
s7 = pd.Series(np.arange(5), index=np.arange(100, 105), dtype=np.int16)
s7
s7.index
s7.index.values
s7[102], s7[104]
s7[[102, 104]]
s7[100] # scalar value
s7[[100]] # Series 1차원
s7[[104, 102, 102, 100]]
s7[104] = 70
70
s7[105] = 90 # 없던 index에 value 대입 -> 새로 생김 Dict과 비슷함.
s7
s7[[101, 102]] = 10, 20
s7
s7.index
s8 = pd.Series(np.arange(6), s7.index) # 기존의 index 사용가능.
s8
s6
s6.name = '급여'
s6
s6.index.name = '이름'
s6
s6.index
s6.index = ['Kim', 'Lee', 'Choi', 'Park']
s6
s1 = pd.Series([1, 1, 2, 1, 2, 2, 2, 1, 1, 3, 3, 4, 5, 5, 7, np.NaN])
s1
s1
s1.ndim
s1.shape
s1.size
len(s1)
s1.unique()
s1.count() # 실제 데이터가 있는 값만 count! NaN은 제외됨.
a1 = np.array([2, 2, 2, 2, np.NaN])
a1.mean() # nan 이 나온다... numpy 의 경우 array 원소 중에 NaN 이 있으면 연산 불가 (즉 NaN 이 나옴)
pd.Series(a1).mean() # NaN 원소 무시하고 평균값 산출
s1.value_counts()
s1.head() # 상위 5개
s1.tail() # 하위 5개
s1.head(3)
s1.tail(3)
s1 = pd.Series([1, 2, 3, 4], ['a', 'b', 'c', 'd'])
s2 = pd.Series([6, 3, 2, 1], ['d', 'c', 'b', 'a']) # 인덱스 순서 다르다
s1
s2
s1 + s2
s1 ** 2
s1 ** s2
s1['k'] = 7
s2['e'] = 9
s1
s2
s1 + s2
s = pd.Series(np.arange(10), np.arange(10) + 1)
s
s > 5 # 결과는 boolean series
s[s > 5]
s[s % 2 == 0]
s.index > 5 # boolean mask
s[s.index % 2 == 0]
s = pd.Series(np.arange(100, 105), ['a', 'b', 'c', 'd', 'e'])
s
s['a'] = 200
s
s['k'] = 300
s
s.drop('k') # 원본 변화 없음
s
s.drop('k', inplace = True) # 리턴값이 None(없다)! 따라서 원본이 변한다.
s
s1 = pd.Series(np.arange(100, 105))
s1
s[1:3]
s2 = pd.Series(np.arange(100, 105), ['a','b','c','d','e'])
s2
s2[1:3] # 동작한다!?!?!! # 인덱스가 숫자타입이 아닌경우, 0-base 인덱싱, 슬라이싱 사용 가.능
s2['b':'d'] # index가 문자열타입인 경우 마지막 index값 포함.
s3 = pd.Series([1, 2, 3, 4, 5, 6], ['a', 'a', 'b', 'b', 'c', 'c'])
s3
s3.index
s4 = pd.Series(
np.arange(100,106),
index = [['a', 'a', 'b', 'b', 'c', 'c'],
[ 1, 2, 1, 2, 1, 2]]
)
s4
s4.index
s4['a', 1]
s4['a']
s4['a'][1]
s4['a':'b'] # level 0의 슬라이스 인덱스
s4[('a',2):('b',2)]
cross-section
axis = 0, level = 0
s4.xs('a') # level 0 인덱싱 <= s4['a']와 동일
s4.xs(('a',1)) # <= s4['a', 1]과 동일
s4
s4.xs(2, level = 1)
s4.xs(2, level = -1)
s4.xs((2,'b'), level=(1,0))
data = pd.Series(
[100, 200, 300, 400, 500, 600],
index=[
["a", "a", "a", "b", "b", "c"], # level 0 index
[1, 2, 3, 1, 2, 1], # level 1 index
]
)
data
data.sum()
data.mean()
data.sum(level=None)
data.sum(level=0)
data.groupby(level=0).sum()