728x90
반응형
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)
합계 행 만들기 !!¶
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[ ]:
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]]
Out[ ]:
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[ ]:
In [ ]:
### Transpose 는 array 고 dataframe 이고 모두 뒤에 T 붙이면 됨 (간단)
display(korea_df.T)
korea_arr = korea_df.values
display(korea_arr.T)
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[ ]:
In [ ]:
## 남녀 비율의 합계를 제거하고 싶다면? iloc 으로 접근
sum_korea_df.iloc[-1,-1] = None
sum_korea_df
Out[ ]:
In [ ]:
## 이렇게 판다스 특정 칼럼에서 조건을 주면 seires 로 반환이됨 (특정 칼럼이 시리즈로 구성되어있으니까 ! )
a = korea_df.여자인구수 > 1971505
print(type(a))
korea_df.loc[korea_df.여자인구수 > 1971505] ## 인덱스 true 인 것만 나옴
korea_df.loc[(korea_df.인구수 < 4887170)]
Out[ ]:
In [ ]:
korea_df
Out[ ]:
In [ ]:
### 남자가 더 많은 곳을 찾아라 (남녀비율 100 이상인 곳 찾으면 됨)
korea_df.loc[:,'남녀비율'] = round((korea_df.남자인구수 * 100) / (korea_df.여자인구수),2)
display(korea_df)
korea_df.loc[(korea_df.남녀비율 >= 100)]
display(korea_df)
In [ ]:
### 남자가 더 많으면서 여자 인구수가 2328207 이상이 곳
korea_df.loc[(korea_df.남녀비율 >= 100) & (korea_df.여자인구수 >= 2328207)]
Out[ ]:
iloc - 정수 인덱스를 입력¶
In [ ]:
korea_df.iloc[:2,:1] # 2행 1열 만
Out[ ]:
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)
In [ ]:
pop_tuples = np.random.randint(10000000,50000000,12,)
population = pd.Series(pop_tuples, index = idx_tuples )
population ## 하지만 멀티인덱스 객체 아님
Out[ ]:
pd.MultiIndex.from_tuples(tuple list)¶
: multi index 객체 만들기
In [ ]:
midx = pd.MultiIndex.from_tuples(idx_tuples) # 이중 인덱스가 튜플로 담긴 리스트를 넣어줌
print(midx)
population2 = population.reindex(midx)
population2
Out[ ]:
In [ ]:
print(population2[:,2010]) ### 2010 년도 칼럼의 모든 행 보여줭
print(population2['대전',:]) ### 대전 행의 모든 칼럼 보여줭
In [ ]:
DF = pd.DataFrame(population2)
DF
Out[ ]:
pd.MultiIndex.from_arrays (2d array)¶
In [ ]:
np.random.rand(10,3)
Out[ ]:
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[ ]:
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[ ]:
pd.MultiIndex.from_product(매칭 안된 2개 리스트)¶
In [ ]:
pd.MultiIndex.from_product([['a','b','c'],[1,2]])
Out[ ]:
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[ ]:
data.unstack() // data.stack()¶
: multi index 다시 풀기 : multi index 다시 풀기
In [ ]:
## 2010, 2020 을 칼럼으로 두고 싶다면
uns_df = DF.unstack()
uns_df
Out[ ]:
In [ ]:
## 다시 묶고 싶다면
df = uns_df.stack()
df
Out[ ]:
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))
In [ ]:
Data = pd.DataFrame({'총인구수': population2, '남자인구수': male_tuple, '여자인구수': female_tuple})
Data ## 이때 population2 가 multi index로 변환된 series 객체여서 data frame 도 multiindex로 나옴
Data.loc[:,'총인구수'] = Data.남자인구수 + Data.여자인구수
Data
Out[ ]:
In [ ]:
### 남녀 비율도 만들어 보기
# 방법 1. loc 활용하기
Data.loc[:,'남녀비율'] = round(Data.남자인구수 * 100 / Data.여자인구수,2)
Data
Out[ ]:
unstack, stack level¶
In [ ]:
Data
Out[ ]:
In [ ]:
display(Data.unstack(level = 1)) # 두번째 계층 인덱스가 - 계층 칼럼으로 들어가지게 됨.
display(Data.unstack(level = 0)) # 첫번째 계층 인덱스가 - 계층 칼럼으로 들어가지게 됨.
series(for multi- index).index.names¶
: 인덱스 이름 설정
In [ ]:
population2.index.names = ['행정구역','년도']
In [ ]:
population2
Out[ ]:
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[ ]:
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
Out[ ]:
다중 인덱스 슬라이싱 - 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
반응형
댓글