티스토리 뷰
1. 데이터 불러오기(CSV)
import pandas as pd
df = pd.read_csv('파일경로 및 파일이름', encoding = 'utf-8-sig', index_col = 0, use_cols = ['START_TIME', 'END_TIME'])
df
#### 파일경로 및 파일이름 : 유니코드('/','\') 에러가 자주 발생
해당 에러시 수정하여 사용할 것(os.filepath를 활용하면 딱히 문제될 것 없음, 경로는 항상 os 라이브러리를 활용할 것)
#### encoding : 'utf-8-sig' -> 한글 관련 인코딩
#### index_col = 0 : 가장 첫번째 컬럼을 인덱스로 지정(굳이 안써도 되는 경우가 많음)
#### use_cols = ['START_TIME', 'END_TIME'] : csv 파일을 읽을 때, 특정 컬럼만 추출하여 읽기(메모리 소모↓)
2. 데이터 추출
#### (1) 컬럼 전체를 보고 싶은 경우
df['컬럼명']
#### (2) 특정 데이터 하나를 불러오고 싶은 경우, df.loc[행, 열]로 기억
df.loc[인덱스, '컬럼명']
#### (3) 조건식 데이터 추출 기본
df.loc[조건, 컬럼]
#### (4) 조건식 데이터 추출 심화
# df[조건] 해당 코드는 True, False 형태의 시리즈로 반환
# 이 때 df[df[조건]]으로 쓰면, 조건에 맞는 데이터만 추출이 가능하다.
df[(df['기간'] >= 3) & (df['기간'] < 7)]
df.loc의 경우엔 인덱스를 활용해서 추출하는 경우가 많은데,
유용한 예제는 다음과 같다.
(1) index 활용
이 방법은 가독성이 좋고 깔끔하다.
for idx in df.index:
Time_data = df.loc[idx, 'Time']
print(Time_data)
(2) enumerate 활용
이 방법은 for문으로 원하는 데이터만 나열할 수 있기 때문에, 원하는 컬럼의 데이터 전부 뽑을 때 좋다.
물론 index 또한 받을 수 있어서, 다른 데이터를 불러올 수도 있다.
for idx, time in enumerate(df['TIME'])
print(time)
print(df.loc[idx,'NAME'])
이런 식으로 df.loc를 활용하면 for문으로 모든 데이터를 직접 지정해서 변수에 저장하고 출력할 수 있다.
다만 데이터가 커질 경우, for문이 상당히 비효율적인데, 이 때는 apply 함수를 활용하면 좋다(후술)
(3) isin 활용
주어진 리스트가 있을 경우, isin을 활용하여 원하는 데이터만 추출이 가능하다.
year_list = [2011,2012,2013]
# 데이터프레임의 YEAR 컬럼 중 2011,2012,2013 데이터 추출
df[df['YEAR'].isin(year_list)]
# 데이터프레임의 YEAR 컬럼 중 '2019'가 아닌 데이터 추출
df[df['YEAR'].isin(year_list) == False]
isin의 경우의에는 파라미터 부분에 반드시 리스트를 삽입해줘야하고, 데이터 수가 많을 경우 isin을 쓰는게 훨씬 효율적이니 해당 방법을 활용하자.
3. 데이터 편집
(1) reset_index(인덱스 초기화)
df.reset_index(drop=True,inplace=True)
해당 메소드는 인덱스가 복잡하게 꼬여있는 상황에, 인덱스를 초기화해주는 메소드이다.
drop = True :기존의 사용되던 인덱스를 삭제 / 아무것도 적지 않으면, 기존의 사용되던 인덱스를 컬럼으로 활용 가능
inplace = True : 해당 메소드를 기존 데이터프레임에 바로 적용
(2) 컬럼명 변경
df.rename(columns={'SP_CS_ID':'충전소','cnt':'버스대수','지역':'지역(시군구)'},inplace=True)
#### 컬럼명 순서 변경의 경우 이런 식으로 원하는 컬럼의 순서를 써서 적용한다.
df = df[['시간','이름','제목']]
columns에 키 밸류 값으로 넣어서, 원하는 컬럼명으로 바꿀 수 있다.
4. apply
#### 한 값을 변수로 받을 경우
def format_changer(datetime_str, format_):
try:
return parse(datetime_str).strftime(format_)
except:
return datetime_str
##
df['Year'].apply(labmda x : format_changer(x, format_)
##
#### 두개 이상의 값을 변수로 받을 경우
def plus(a,b):
return a + b
##
df.apply(lambda x : plus(x['redc_strd_vl'], x['pwrer_usqnt']), axis = 1)
##
apply는 for문에 비해 연산속도가 굉장히 빠르기 때문에, 웬만해서는 apply를 활용하여 데이터를 가공한다.
한 값을 변수로 받는 경우, 두개 이상의 값을 변수로 받는 경우 등 다양하기 때문에, 케이스에 맞춰 사용해야한다.
특히 두개 이상의 값을 변수로 받는 경우는 활용도가 무궁무진하므로, 잘 기억해두자
5. 분산처리(chunks)
# chuncks 사용법
chunks = pd.read_csv(path, encoding = 'utf-8-sig', chunksize = 1000000)
for idx, sample_df in enumerate(chunks):
sample_df['prdct_dtm'] = sample_df['prdct_dtm'].apply(lambda x : parse(x).strftime('%Y-%m-%d %H:%M:%S'))
if idx == 0:
df.to_csv('/nas/process/processing_data.csv', index = False, encoding = 'utf-8-sig')
else :
df.to_csv('/nas/process/processing_data.csv', index = False, encoding = 'utf-8-sig', header = False, mode = 'a')
- 먼저 청크사이즈를 설정하여, 서버 혹은 컴퓨터 사양에 맞게 설정한다.
- 이후 청크 데이터를 반복문을 통해 돌리며, 가공을 한다.
- 가공된 데이터는 청크 데이터가 가장 첫번째인 것을 제외하고는, 덧붙이는 방식(mode = 'a')으로 코드를 작성한다.
(뒤의 경우엔 header는 반드시 False : 붙이는 경우 header가 들어가면 안되기 때문이다.)
6. 기타
- df.head(5) : 맨 위 다섯개의 행 출력
- df.tail(5) : 맨 아래 다섯개의 행 출력
- df.sample(30) : 무작위로 30개의 행 추출
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
>> 지속 업데이트 예정