본문 바로가기
카테고리 없음

[DataScience] pandas - 기본method, multiindex, timeseries (201021)

by 후이 (hui) 2020. 10. 21.
728x90
반응형
1019_pandasallinone
In [ ]:
import pandas as pd 
import numpy as np
In [ ]:
# Ctrl+Space, Option+Esc 또는 Tab자동완성

인덱싱 iloc, loc **

  • 데이터 연산
  • 데이터 결합 ***
  • 데이터 집계 그룹 (그룹바이 )
  • 문자열
  • 시계열 *** 중요 아주 중요 3:00
  • 텍스트 파일 일기 쓰기 - json, txt, excel 파일 모두 다 불러오는 법,
  • 데이터 누락값처리
In [ ]:
from IPython.core.display import display, HTML
display(HTML("<style>.container {width:90% !important;}</style>"))
In [ ]:
## 1. 난수 지정 
a = np.random.randint(1000000,5000000, size = (5,)) ## 범위 + 아웃풋 형태
b = np.random.randint(1,10) ## 아웃풋 형태 없으면 그저 랜덤한 숫자 하나만 반환됨
c = np.random.rand(5,5) ## 아웃풋 형태만 (범위는 0~1사이의 값으로 고정)
d = np.random.randn(5,5) ## 정규 분포, 가우시안 분포 (-1 과 1 사이의)

print(a)
print(b)
print(c)
print(d)
[4857576 3056686 1535710 2347132 4028939]
1
[[0.6419674  0.37309954 0.337401   0.73511371 0.69919734]
 [0.13502196 0.22583278 0.31235649 0.80631578 0.18133023]
 [0.1483351  0.32780983 0.38213388 0.81195311 0.58132881]
 [0.07255976 0.92980794 0.2942168  0.28473562 0.17630808]
 [0.36301882 0.36876583 0.7394617  0.65537499 0.85112537]]
[[ 0.89717826  0.21822665  1.68288914 -0.80664913 -0.81180573]
 [-0.32691894  0.4234114   1.41521961  0.90522315 -1.70728352]
 [ 0.50384089 -2.03282819 -0.31111295  1.57655348  1.15480878]
 [ 0.48432025 -0.03764902  0.20366613  1.89868734  1.77630356]
 [-1.06765888  0.03356047 -0.77898995 -1.65696187 -0.75025655]]

합계 행 만들기 !!

In [ ]:
## np.random.randint 로 series 객체 만들기 
location = ['서울','인천','부산','대구','대전','광주']
female_num = np.random.randint(1000000,5000000, size = (6,))
male_num = np.random.randint(1000000,5000000, size = (6,))
male_series = pd.Series(male_num, index = location)
female_series = pd.Series(female_num, index = location)
In [ ]:
## series 객체를 value, 칼럼명을 key로 두어서 DataFrame 만들기 
korea_df = pd.DataFrame({'남자인구수': male_series, '여자인구수': female_series})
korea_df['인구수'] = korea_df.sum(axis = 1) # 행별로 합한거 넣기 
korea_df = korea_df[['인구수','남자인구수','여자인구수']]
In [ ]:
korea_df
Out[ ]:
인구수 남자인구수 여자인구수
서울 4872245 3238104 1634141
인천 7184950 2991225 4193725
부산 5330234 2632288 2697946
대구 8756508 4822535 3933973
대전 8812725 4785329 4027396
광주 6410631 1592225 4818406

1. 인덱싱 loc, iloc

iloc : integer position을 통해 값을 찾는다.

loc : label을 통해서 값을 찾는다.

문법 공통점: df1.loc[[행],[열]]

  • 행 탐색 : df1.loc[:2]

: df1.iloc[:2]

  • 열탐색

: df1.loc[:2, ['Survived', 'Pclass','Name']]

: df1.iloc[:2,1:4]

In [ ]:
### 데이터 에서 짝수행만 가지고 오는 방법 
### ** loc 은 이름을 불러와야 한다. 
print(korea_df.index[::2])
korea_df.loc[korea_df.index[::2]]
Index(['서울', '부산', '대전'], dtype='object')
Out[ ]:
인구수 남자인구수 여자인구수
서울 4872245 3238104 1634141
부산 5330234 2632288 2697946
대전 8812725 4785329 4027396
In [ ]:
# 위의 df 와 전체 df에서 제외되는 부분만 추출하려면
sample_df = korea_df.loc[korea_df.index[::2]]
dif_df_idx = korea_df.index.difference(sample_df.index) # 더 큰놈이 앞에 나와야 해 
korea_df.loc[dif_df_idx]
Out[ ]:
인구수 남자인구수 여자인구수
광주 6410631 1592225 4818406
대구 8756508 4822535 3933973
인천 7184950 2991225 4193725
In [ ]:
### Transpose 는 array 고 dataframe 이고 모두 뒤에 T 붙이면 됨 (간단)
display(korea_df.T)
korea_arr = korea_df.values
display(korea_arr.T)
서울 인천 부산 대구 대전 광주
인구수 4872245 7184950 5330234 8756508 8812725 6410631
남자인구수 3238104 2991225 2632288 4822535 4785329 1592225
여자인구수 1634141 4193725 2697946 3933973 4027396 4818406
array([[4872245, 7184950, 5330234, 8756508, 8812725, 6410631],
       [3238104, 2991225, 2632288, 4822535, 4785329, 1592225],
       [1634141, 4193725, 2697946, 3933973, 4027396, 4818406]])

loc 의 특징

칼럼명 또는, 각 인덱스 별 True false 값으로 된 시리즈

In [ ]:
## ** 중요 ** loc 으로 새로운 행, 렬 삽입 

## 행을 생성하는 거면 : sum_korea_df.loc['인덱스 이름'] 
## 열을 생성하는 거면 : sum_korea_df.iloc[:,'열 이름'] 

sum_korea_df = korea_df.copy()
sum_korea_df.loc['합계'] = sum_korea_df.sum(axis = 0) # 각 열의 합을 구하려면 axis 0
sum_korea_df.loc[:,'남녀비율'] = round(sum_korea_df.남자인구수 * 100 / sum_korea_df.여자인구수, 2) ## 바로 때려줘도됨 
sum_korea_df
Out[ ]:
인구수 남자인구수 여자인구수 남녀비율
서울 4872245 3238104 1634141 198.15
인천 7184950 2991225 4193725 71.33
부산 5330234 2632288 2697946 97.57
대구 8756508 4822535 3933973 122.59
대전 8812725 4785329 4027396 118.82
광주 6410631 1592225 4818406 33.04
합계 41367293 20061706 21305587 94.16
In [ ]:
## 남녀 비율의 합계를 제거하고 싶다면? iloc 으로 접근 
sum_korea_df.iloc[-1,-1] = None
sum_korea_df
Out[ ]:
인구수 남자인구수 여자인구수 남녀비율
서울 4872245 3238104 1634141 198.15
인천 7184950 2991225 4193725 71.33
부산 5330234 2632288 2697946 97.57
대구 8756508 4822535 3933973 122.59
대전 8812725 4785329 4027396 118.82
광주 6410631 1592225 4818406 33.04
합계 41367293 20061706 21305587 NaN
In [ ]:
## 이렇게 판다스 특정 칼럼에서 조건을 주면 seires 로 반환이됨 (특정 칼럼이 시리즈로 구성되어있으니까 ! )
a = korea_df.여자인구수 > 1971505
print(type(a))
korea_df.loc[korea_df.여자인구수 > 1971505] ## 인덱스 true 인 것만 나옴 
korea_df.loc[(korea_df.인구수 < 4887170)]
<class 'pandas.core.series.Series'>
Out[ ]:
인구수 남자인구수 여자인구수
서울 4872245 3238104 1634141
In [ ]:
korea_df
Out[ ]:
인구수 남자인구수 여자인구수
서울 4872245 3238104 1634141
인천 7184950 2991225 4193725
부산 5330234 2632288 2697946
대구 8756508 4822535 3933973
대전 8812725 4785329 4027396
광주 6410631 1592225 4818406
In [ ]:
### 남자가 더 많은 곳을 찾아라 (남녀비율 100 이상인 곳 찾으면 됨)
korea_df.loc[:,'남녀비율'] = round((korea_df.남자인구수 * 100) / (korea_df.여자인구수),2)
display(korea_df)

korea_df.loc[(korea_df.남녀비율 >= 100)]
display(korea_df)
인구수 남자인구수 여자인구수 남녀비율
서울 4872245 3238104 1634141 198.15
인천 7184950 2991225 4193725 71.33
부산 5330234 2632288 2697946 97.57
대구 8756508 4822535 3933973 122.59
대전 8812725 4785329 4027396 118.82
광주 6410631 1592225 4818406 33.04
인구수 남자인구수 여자인구수 남녀비율
서울 4872245 3238104 1634141 198.15
인천 7184950 2991225 4193725 71.33
부산 5330234 2632288 2697946 97.57
대구 8756508 4822535 3933973 122.59
대전 8812725 4785329 4027396 118.82
광주 6410631 1592225 4818406 33.04
In [ ]:
### 남자가 더 많으면서 여자 인구수가 2328207 이상이 곳 
korea_df.loc[(korea_df.남녀비율 >= 100) & (korea_df.여자인구수 >= 2328207)]
Out[ ]:
인구수 남자인구수 여자인구수 남녀비율
대구 8756508 4822535 3933973 122.59
대전 8812725 4785329 4027396 118.82

iloc - 정수 인덱스를 입력

In [ ]:
korea_df.iloc[:2,:1] # 2행 1열 만 
Out[ ]:
인구수
서울 4872245
인천 7184950

2. 다중인덱싱

In [ ]:
idx_tuples = [('서울',2010),('서울',2020),
              ('인천',2010),('인천',2020),
              ('부산',2010),('부산',2020),
              ('대구',2010),('대구',2020),
              ('대전',2010),('대전',2020), 
              ('광주',2010),('광주',2020)]
print(type(idx_tuples))
print(type(idx_tuples[0]))
print(idx_tuples)
<class 'list'>
<class 'tuple'>
[('서울', 2010), ('서울', 2020), ('인천', 2010), ('인천', 2020), ('부산', 2010), ('부산', 2020), ('대구', 2010), ('대구', 2020), ('대전', 2010), ('대전', 2020), ('광주', 2010), ('광주', 2020)]
In [ ]:
pop_tuples = np.random.randint(10000000,50000000,12,)
population = pd.Series(pop_tuples, index = idx_tuples )
population  ## 하지만 멀티인덱스 객체 아님 
Out[ ]:
(서울, 2010)    30892952
(서울, 2020)    47045993
(인천, 2010)    48358899
(인천, 2020)    29185770
(부산, 2010)    44271291
(부산, 2020)    38152070
(대구, 2010)    19601367
(대구, 2020)    49774558
(대전, 2010)    18882838
(대전, 2020)    46911064
(광주, 2010)    46810303
(광주, 2020)    40634616
dtype: int64

pd.MultiIndex.from_tuples(tuple list)

: multi index 객체 만들기

In [ ]:
midx = pd.MultiIndex.from_tuples(idx_tuples) # 이중 인덱스가 튜플로 담긴 리스트를 넣어줌
print(midx)
population2 = population.reindex(midx)
population2
MultiIndex([('서울', 2010),
            ('서울', 2020),
            ('인천', 2010),
            ('인천', 2020),
            ('부산', 2010),
            ('부산', 2020),
            ('대구', 2010),
            ('대구', 2020),
            ('대전', 2010),
            ('대전', 2020),
            ('광주', 2010),
            ('광주', 2020)],
           )
Out[ ]:
서울  2010    30892952
    2020    47045993
인천  2010    48358899
    2020    29185770
부산  2010    44271291
    2020    38152070
대구  2010    19601367
    2020    49774558
대전  2010    18882838
    2020    46911064
광주  2010    46810303
    2020    40634616
dtype: int64
In [ ]:
print(population2[:,2010]) ###  2010 년도 칼럼의 모든 행 보여줭 
print(population2['대전',:]) ### 대전 행의 모든 칼럼 보여줭
서울    30892952
인천    48358899
부산    44271291
대구    19601367
대전    18882838
광주    46810303
dtype: int64
2010    18882838
2020    46911064
dtype: int64
In [ ]:
DF = pd.DataFrame(population2)
DF
Out[ ]:
0
서울 2010 30892952
2020 47045993
인천 2010 48358899
2020 29185770
부산 2010 44271291
2020 38152070
대구 2010 19601367
2020 49774558
대전 2010 18882838
2020 46911064
광주 2010 46810303
2020 40634616

pd.MultiIndex.from_arrays (2d array)

In [ ]:
np.random.rand(10,3)
Out[ ]:
array([[0.37230008, 0.62633499, 0.00991523],
       [0.37018968, 0.31911779, 0.45474821],
       [0.06407634, 0.76478826, 0.0990659 ],
       [0.27240323, 0.02673089, 0.35278531],
       [0.55649381, 0.66734828, 0.85120343],
       [0.85563445, 0.78745379, 0.87946566],
       [0.18657908, 0.94192038, 0.52939398],
       [0.44734538, 0.01741654, 0.04823885],
       [0.98827389, 0.43092219, 0.57937257],
       [0.77798067, 0.68380499, 0.83785628]])
In [ ]:
df = pd.DataFrame(np.random.rand(10,3), 
                  index = [['a','a','b','b','c','c','d','d','e','e'],[1,2, 1,2, 1,2, 1,2, 1,2]],
                  columns = ['c1','c2','c3'])

df
Out[ ]:
c1 c2 c3
a 1 0.122388 0.074401 0.549590
2 0.095819 0.122972 0.905428
b 1 0.021444 0.239344 0.517767
2 0.951653 0.313447 0.035201
c 1 0.698449 0.641869 0.364555
2 0.980015 0.673288 0.439764
d 1 0.145444 0.114629 0.132438
2 0.538886 0.786745 0.040844
e 1 0.268326 0.530804 0.029271
2 0.192878 0.173934 0.439320
In [ ]:
twod_index = np.array([['a','a','b','b','c','c','d','d','e','e'],[1,2, 1,2, 1,2, 1,2, 1,2]])
pd.MultiIndex.from_arrays(twod_index)
Out[ ]:
MultiIndex([('a', '1'),
            ('a', '2'),
            ('b', '1'),
            ('b', '2'),
            ('c', '1'),
            ('c', '2'),
            ('d', '1'),
            ('d', '2'),
            ('e', '1'),
            ('e', '2')],
           )

pd.MultiIndex.from_product(매칭 안된 2개 리스트)

In [ ]:
pd.MultiIndex.from_product([['a','b','c'],[1,2]]) 
Out[ ]:
MultiIndex([('a', 1),
            ('a', 2),
            ('b', 1),
            ('b', 2),
            ('c', 1),
            ('c', 2)],
           )

pd.Multiindex(levels = [], codes = [])

** 만약 a 는 12 로 하고 b,c 는 2만 하고 싶은 경우

In [ ]:
pd.MultiIndex(levels = [['a','b','c'], [1,2]],
              codes = [[0,0,1,2],[0,1,1,1]])
Out[ ]:
MultiIndex([('a', 1),
            ('a', 2),
            ('b', 2),
            ('c', 2)],
           )

data.unstack() // data.stack()

: multi index 다시 풀기 : multi index 다시 풀기

In [ ]:
## 2010, 2020 을 칼럼으로 두고 싶다면 
uns_df = DF.unstack()
uns_df
Out[ ]:
0
2010 2020
광주 46810303 40634616
대구 19601367 49774558
대전 18882838 46911064
부산 44271291 38152070
서울 30892952 47045993
인천 48358899 29185770
In [ ]:
## 다시 묶고 싶다면 
df = uns_df.stack()
df
Out[ ]:
0
광주 2010 46810303
2020 40634616
대구 2010 19601367
2020 49774558
대전 2010 18882838
2020 46911064
부산 2010 44271291
2020 38152070
서울 2010 30892952
2020 47045993
인천 2010 48358899
2020 29185770
In [ ]:
male_tuple = np.random.randint(1000000,5000000,size=(12,))
female_tuple = np.random.randint(1000000,5000000,size=(12,))
In [ ]:
print(population2)
print(type(population2))
서울  2010    30892952
    2020    47045993
인천  2010    48358899
    2020    29185770
부산  2010    44271291
    2020    38152070
대구  2010    19601367
    2020    49774558
대전  2010    18882838
    2020    46911064
광주  2010    46810303
    2020    40634616
dtype: int64
<class 'pandas.core.series.Series'>
In [ ]:
Data = pd.DataFrame({'총인구수': population2, '남자인구수': male_tuple, '여자인구수': female_tuple})
Data ## 이때 population2 가 multi index로 변환된 series 객체여서 data frame 도 multiindex로 나옴 
Data.loc[:,'총인구수'] = Data.남자인구수 + Data.여자인구수
Data
Out[ ]:
총인구수 남자인구수 여자인구수
서울 2010 6244920 2925681 3319239
2020 7082650 2946296 4136354
인천 2010 9239169 4555693 4683476
2020 5440412 2808838 2631574
부산 2010 5818327 4758458 1059869
2020 8769091 3965862 4803229
대구 2010 7403173 3073623 4329550
2020 9174724 4689310 4485414
대전 2010 6679752 4317542 2362210
2020 3086396 1738493 1347903
광주 2010 5967247 3269633 2697614
2020 9292586 4428698 4863888
In [ ]:
### 남녀 비율도 만들어 보기 
# 방법 1. loc 활용하기 
Data.loc[:,'남녀비율'] = round(Data.남자인구수 * 100 / Data.여자인구수,2)
Data
Out[ ]:
총인구수 남자인구수 여자인구수 남녀비율
서울 2010 6244920 2925681 3319239 88.14
2020 7082650 2946296 4136354 71.23
인천 2010 9239169 4555693 4683476 97.27
2020 5440412 2808838 2631574 106.74
부산 2010 5818327 4758458 1059869 448.97
2020 8769091 3965862 4803229 82.57
대구 2010 7403173 3073623 4329550 70.99
2020 9174724 4689310 4485414 104.55
대전 2010 6679752 4317542 2362210 182.78
2020 3086396 1738493 1347903 128.98
광주 2010 5967247 3269633 2697614 121.20
2020 9292586 4428698 4863888 91.05

unstack, stack level

In [ ]:
Data
Out[ ]:
총인구수 남자인구수 여자인구수 남녀비율
서울 2010 6244920 2925681 3319239 88.14
2020 7082650 2946296 4136354 71.23
인천 2010 9239169 4555693 4683476 97.27
2020 5440412 2808838 2631574 106.74
부산 2010 5818327 4758458 1059869 448.97
2020 8769091 3965862 4803229 82.57
대구 2010 7403173 3073623 4329550 70.99
2020 9174724 4689310 4485414 104.55
대전 2010 6679752 4317542 2362210 182.78
2020 3086396 1738493 1347903 128.98
광주 2010 5967247 3269633 2697614 121.20
2020 9292586 4428698 4863888 91.05
In [ ]:
display(Data.unstack(level = 1)) # 두번째 계층 인덱스가 - 계층 칼럼으로 들어가지게 됨. 
display(Data.unstack(level = 0)) # 첫번째 계층 인덱스가 - 계층 칼럼으로 들어가지게 됨. 
총인구수 남자인구수 여자인구수 남녀비율
2010 2020 2010 2020 2010 2020 2010 2020
광주 5967247 9292586 3269633 4428698 2697614 4863888 121.20 91.05
대구 7403173 9174724 3073623 4689310 4329550 4485414 70.99 104.55
대전 6679752 3086396 4317542 1738493 2362210 1347903 182.78 128.98
부산 5818327 8769091 4758458 3965862 1059869 4803229 448.97 82.57
서울 6244920 7082650 2925681 2946296 3319239 4136354 88.14 71.23
인천 9239169 5440412 4555693 2808838 4683476 2631574 97.27 106.74
총인구수 남자인구수 여자인구수 남녀비율
광주 대구 대전 부산 서울 인천 광주 대구 대전 부산 서울 인천 광주 대구 대전 부산 서울 인천 광주 대구 대전 부산 서울 인천
2010 5967247 7403173 6679752 5818327 6244920 9239169 3269633 3073623 4317542 4758458 2925681 4555693 2697614 4329550 2362210 1059869 3319239 4683476 121.20 70.99 182.78 448.97 88.14 97.27
2020 9292586 9174724 3086396 8769091 7082650 5440412 4428698 4689310 1738493 3965862 2946296 2808838 4863888 4485414 1347903 4803229 4136354 2631574 91.05 104.55 128.98 82.57 71.23 106.74

series(for multi- index).index.names

: 인덱스 이름 설정

In [ ]:
population2.index.names = ['행정구역','년도']
In [ ]:
population2
Out[ ]:
행정구역  년도  
서울    2010    30892952
      2020    47045993
인천    2010    48358899
      2020    29185770
부산    2010    44271291
      2020    38152070
대구    2010    19601367
      2020    49774558
대전    2010    18882838
      2020    46911064
광주    2010    46810303
      2020    40634616
dtype: int64
In [ ]:
pop2_df = pd.DataFrame(population2)

다중 칼럼, 다중 인덱스 한번에 설정

  • 대학 입시 정원
  • 인덱스 - 년도 / 학교
  • 칼럼 - 전체 성적 / 국영수
In [ ]:
pd.MultiIndex(levels = [['a','b','c'], [1,2]],
              codes = [[0,0,1,2],[0,1,1,1]])
Out[ ]:
MultiIndex([('a', 1),
            ('a', 2),
            ('b', 2),
            ('c', 2)],
           )
In [ ]:
idx = pd.MultiIndex.from_product([['SNU','YSU','KU','SKKU'], [2017,2018,2019,2020]])
col = pd.MultiIndex(levels = [['문과','이과'], ['인문과학','사회과학','자연과학','공학']], 
                    codes = [[0,0,1,1],[0,1,2,3]])
print(idx)
print(col)
uni_info = pd.DataFrame(num_data, index = idx, columns = col)
uni_info
MultiIndex([( 'SNU', 2017),
            ( 'SNU', 2018),
            ( 'SNU', 2019),
            ( 'SNU', 2020),
            ( 'YSU', 2017),
            ( 'YSU', 2018),
            ( 'YSU', 2019),
            ( 'YSU', 2020),
            (  'KU', 2017),
            (  'KU', 2018),
            (  'KU', 2019),
            (  'KU', 2020),
            ('SKKU', 2017),
            ('SKKU', 2018),
            ('SKKU', 2019),
            ('SKKU', 2020)],
           )
MultiIndex([('문과', '인문과학'),
            ('문과', '사회과학'),
            ('이과', '자연과학'),
            ('이과',   '공학')],
           )
Out[ ]:
문과 이과
인문과학 사회과학 자연과학 공학
SNU 2017 1800 1335 1955 1873
2018 1065 1498 1186 1402
2019 1313 1264 1273 1185
2020 1179 1862 1902 1614
YSU 2017 1175 1299 1738 1722
2018 1767 1895 1941 1352
2019 1858 1950 1453 1725
2020 1231 1952 1865 1255
KU 2017 1036 1405 1440 1179
2018 1737 1756 1694 1295
2019 1788 1540 1398 1267
2020 1454 1492 1449 1028
SKKU 2017 1320 1555 1060 1932
2018 1414 1656 1951 1870
2019 1485 1856 1811 1028
2020 1267 1069 1150 1459

다중 인덱스 슬라이싱 - pd.Indexslice

In [ ]:
uni_info.loc[:,('이과','자연과학')] # 이렇게 괄호를 통해 이중 칼럼표시 가능
In [ ]:
## 만약 문과 인문과학 2019 년도 --> 인덱스는 단순히 칼럼처럼 접근하면 안됨. 
# uni_info.loc[(: 2019),('문과','인문과학')]
In [ ]:
## 만약 문과 인문과학 2019 년도 --> 인덱스는 인덱스 슬라이스 객체 사용해야함
idx_slice = pd.IndexSlice
display(uni_info.loc[idx_slice[:,2019],:])
display(uni_info.loc[idx_slice[:,2019],('문과','인문과학')])

다중 인덱스 정렬

In [ ]:
# uni_info['SNU':'KU'] ## 정렬이 안되어있어서 에러가 뜸 
In [ ]:
uni_info = uni_info.sort_index()
uni_info['SKKU':'YSU']  # 에러 안뜸 ! 

remove index, set index - 계층 없애기, 계층 살리기

In [ ]:
uni_info.index.names = ['학교','년도']
uni_info
In [ ]:
# 학교를 칼럼으로 만들어 버리기 reset index level = 0 (인덱스 첫번째 계층이었으니까)
idx_flat = uni_info.reset_index(level = 0) # 인덱스 계층 없애 버리기 ! 
idx_flat
In [ ]:
# 년도를 칼럼으로 만들어 버리기 reset index level = 1 (인덱스 첫번째 계층이었으니까)
idx_flat = uni_info.reset_index(level = 1) # 인덱스 계층 없애 버리기 ! 
idx_flat
In [ ]:
## 전체다 칼럼으로 만들어 버리기 
all_flat = uni_info.reset_index(level = (0,1))
all_flat
In [ ]:
### 다시 묶기 
set_data = all_flat.set_index(['학교', '년도'])
set_data

다중 인덱스 합계 행 , 합계 열 만들기

In [ ]:
set_data['합계'] = set_data.sum(axis = 1) # 행별로 합한거 
set_data

3. 정렬과 연산 (간단히 1:29~)

4. 시계열 (중요 ***) (2:56:57~

시계열 인덱스

In [ ]:
idx = pd.DatetimeIndex(['2019-01-01','2019-02-01','2019-03-01','2019-04-01'])
time_num = pd.Series([0,1,2,3], index = idx)
time_num
In [ ]:
### 1월 3일 이후 ## 이건 
time_num['2019-01-03':]
In [ ]:
idx_num = pd.Index([1,3,5,6,7])
se_num = pd.Series([0,1,2,3,3], index = idx_num)
se_num[3:] # 여기서는 숫자 인덱스로만 인식 (3번째 이후 인덱스 반환 ! )
In [ ]:
### 2019 년도만 보여줘 
time_num['2019']

시계열 객체

In [ ]:
from datetime import datetime
In [ ]:
ex1 = '12-12-2019'
ex2 = datetime(2020,1,1)
ex3 = '13rd of feb, 2019'
ex4 = '2020-Mar-4'
ex5 = '200701'
ex6 = '20200701'

dates = pd.to_datetime([ex1, ex2, ex3, ex4, ex5,ex6])
dates
In [ ]:
## 해당 인덱스를 기간을 나타내는 구조로 바꾸기 
dates.to_period('D')
In [ ]:
## 만약 특정 기준일을 기반으로 time delta를 구해야한다면 ? 
key_date = pd.to_datetime('2020-01-01')
print(dates - key_date) ### Timedeltaindex 로 반환이 됩니다 ! 
In [ ]:
### 2020 년도의 모든 날들 p
print(pd.date_range('2020-01-01','2020-12-31'))

### 2020 년도 중 100일 
pd.date_range(start = '2020-01-01',  periods = 100, freq = 'D')

### 2020 1월 1일 중 7시간만 
print(pd.date_range(start = '2020-01-01 00:00:00', periods = 7, freq = 'H'))

### 2020 1월 1일 중 10초 10개  
print(pd.date_range(start = '2020-01-01 00:00:00', periods = 10, freq = '10S'))

'''
freq 
초 : S / 10초 10S
분 : T, min / 10min
시 : H
일 : D
월 : M
년 : Y

** 
요일 (평일만 뜨도록) : B
'''
In [ ]:
### 결측시간 넣기 
idx = pd.to_datetime(['2020-01-01','2020-01-02'] + [None])
print(idx)
print(idx[2])
print(idx.isnull())

시계열 기본

In [ ]:
dates = [datetime(2020,1,1),datetime(2020,1,2),
         datetime(2020,1,4),datetime(2020,1,7),
         datetime(2020,1,10),datetime(2020,1,11),
         datetime(2020,1,15)]
         
dates
In [ ]:
ts = pd.Series(np.random.randn(7), index = dates)
ts
In [ ]:
### 해당 시리즈의 두번째 날짜만 보기 
ts[ts.index[2]]
In [ ]:
### 1000 개의 난수를 생성하고, 거기에 2017-10-01 부터 날짜로 매칭하기 
values = np.random.randn(1000)
date_idx = pd.date_range('2017-10-01', freq = 'D', periods = 1000)
s1 = pd.Series(values, index = date_idx)
s1
In [ ]:
### 위의 s1 에서 2020 년도 값만 보는 방법 
s1['2020']
In [ ]:
### 위의 s1 에서 2020.6월 20일 이후 데이터 만 
s1['2020-06-20':]
In [ ]:
## DF 만들기 
tdf = pd.DataFrame(np.random.randn(1000,4), 
                   index = pd.date_range('2017-10-01', periods = 1000),
                   columns = ['A','B','C','D'])

tdf
In [ ]:
tdf['2017-11']
In [ ]:
tdf['2017-11'].sum(axis = 1)
In [ ]:
### 2017 11월 데이터만 가져오기
tdf['2017-11']
 
### 2017 11월 데이터 중 평균이 0.5 이상인 값만 가져오기  *** data.sum(axis = 1) *** 사랑해 그리고 기억해 ! 
tdf['2017-11'].loc[tdf['2017-11'].sum(axis = 1) / 4 > 0.5]

주기와 오프셋

  • 아까 날짜 까지 다 나오게 하는건 pd.date_range
  • 시간 범위만 나오게 하고 싶으면 pd.timedelta_range
In [ ]:
## 9시부터 6시까지 
workhour = pd.timedelta_range('09:00:00','18:00:00', freq = 'H')
workhour
In [ ]:
onehour = pd.timedelta_range('09:00:00','10:00:00',freq = 'S')
onehour
In [ ]:
### 시간별 업무량 체크 데이터 프레임 만들기
work_amount = np.random.randint(32,67,size = (10,2))
hour_idx = workhour
chk_time_df = pd.DataFrame(work_amount, index = hour_idx, columns = ['workA','workB'])
chk_time_df

shift

In [ ]:
### work C 칼럼은 이전 시간 A+B 의 합이다. 이를 shift 연산으로 구한다면 ? (결측치는 0 으로 채우셈)
chk_time_df['workC'] = chk_time_df.sum(axis = 1).shift(1)
chk_time_df = chk_time_df.fillna(0)
chk_time_df

pd.period_range : 기간과 기간연산

  • period range - 딱 구간 시간 범위까지만 표기됨 : '2020-01', '2020-02'

  • date_range : 모든 시간 다 표기됨

In [ ]:
import pandas as pd
from datetime import datetime
In [ ]:
# 1월 부터 6월 까지 period_range 로 만들어보기 (일은 표시 안되도록)
pd.period_range(datetime(2020,1,1), datetime(2020,6,1), freq = 'M')
In [ ]:
# 1월 부터 6월 까지 date r 로 만들어보기 일까지 표시되어버림 
pd.date_range(datetime(2020,1,1), datetime(2020,6,1), freq = 'M')

sampling

기타

In [ ]:
### 특정 인덱스만 불러오기
s[['a','b','c']]
In [ ]:
## unique 값만 추출해내는 방법 
s.unique()
In [ ]:
 pd.DataFrame(np.random.rand(5,5),columns = ['a','b','c','d','e'], index = [1,2,3,4,5])
In [ ]:
### 몰랐네 : 각 행이 딕셔너리 형태로 들어감 
### 딕셔너리의 키 값이 칼럼, 행 값이 
pd.DataFrame([{'A':1, 'B':2, 'C':4}, {'A':1, 'C':3, 'D':2}])
728x90
반응형

댓글