Pandas
1 개요
Series라는 1차원 자료구조와 DataFrame이라는 2차원 자료구조를 이용해 데이터를 다룬다.
금융데이터 분석을 목적으로 개발됨. panel data와 python data analysis에서 유래했다.
내용이 상당히 방대해 세분해야 할 듯하다;;
2 시리즈. Series
리스트와 달리, 인덱싱 값을 지정할 수 있다.
from pandas import Series
의도 | 방법 |
---|---|
선언 | 시리즈명 = Series([1,2,3,4,5], index=[1,2,3,4,5]) |
자료접근 | 시리즈명[인덱스] |
인덱스 리스트 얻기 | 시리즈명.index |
자료 리스트 얻기 | 시리즈명.values |
2.1 연산
시리즈끼리 더하면 같은 인덱스를 가진 값들끼리 더해진다.
2.2 데이터 추가.
시리즈[인덱스]=값 혹은 시리즈=시리즈.append(더할시리즈) 형태로 추가 가능.
2.3 값에 접근하기.
시리즈.loc[인덱스] 는 해당 인덱스의 데이터를 가리킨다.
시리즈.iloc[정수인덱스] sms 0, 1, -1 따위의 정수 순서에 해당하는 값을 불러온다.
인덱스가 복수일 땐 시리즈로 반환한다.
시리즈.values[정수인덱스] 복수일 땐 배열로 반환한다.
2.4 삭제.
시리즈=시리즈.drop(인덱스)
의도 | 설명 | 방법 |
---|---|---|
시리즈 합치기 | df = pandas.DataFrame({'행이름': 시리즈, '행이름2': 다른df['행이름']}) 형태로 합치면 해당 인덱스에 대해 빈 값은 NaN으로 처리되어 합쳐진다. | df = pandas.DataFrame({'행이름': 시리즈, '행이름2': 다른df['행이름']}) |
3 데이터프레임. DataFrame.
2차원 구조의 데이터를 다루기 위한 도구.
3.1 선언 및 데이터 추가
의도 | 방법 |
---|---|
선언 | 가장 쉬운 방법은 사전을 이용한 선언.데이터프레임 = DataFrame({'열이름1':[1,2,3,4,5]
'열이름2':[6,7,8,9,10]
'열이름3':[10,9,8,7,6]
index = 리스트 })
|
칼럼 순서 바꾸기 | 데이터프레임2 = DataFrame(데이터프레임1, columns=[열이름1, 열이름2, ...])
|
열 추가 | 데이터프레임.insert(추가될 위치, "열이름", 붙일데이터)
보통 가장 뒤에 붙여 추가될 위치에 len(데이터프레임.columns)를 넣는다. |
행 추가(리스트로) | 열 갯수와 동일한 리스트를 행에 붙인다.
데이터프레임.loc["새로운인덱스"]=['값1', '값2', ...] 보통, 가장 뒤에 붙이기 위해 len(데이터프레임.index)을 넣는다. |
행 추가(사전으로) | 열 이름과 매칭시킨 사전을 붙인다.
데이터프레임.loc["새로운인덱스"]={"열이름1":'값1', '열이름2':'값2', ...} |
3.2 열 조작
의도 | 방법 | 설명 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
열 리스트 얻기 | df.columns | 어떤 칼럼이 있는지 알려준다. | ||||||||
열 이름 바꾸기 | 데이터프레임.rename(columns={'구이름':'신이름', '구이름2':'신이름2'}, inplace=True) | inplace=True 이 옵션이 뭔진 모르겠네;; 없어도 잘 되긴 한다. | ||||||||
열 순서 바꾸기 및 추출 | df[['열이름1', '열이름2']] | 열이름에 해당하는 순서로 해당 열들만 추출된다. | ||||||||
열 제거 | df = df.drop(columns='열이름') | |||||||||
열 붙이기 | df['새로운 칼럼'] = 칼럼 | 행의 크기가 같은 칼럼을 붙일 수 있다. | ||||||||
새로운 칼럼 만들기 | df['새 칼럼'] = df['열이름'].rank() | 크기가 같은 칼럼을 만든 후 덧붙일 수 있다. | ||||||||
같은 인덱스를 사용하는 데이터의 열 추가. | df = pd.merge(df1, df2, how='옵션', left_index=True, right_index=True) |
| ||||||||
이중칼럼 만들기 | columns = [['1열이름']*len(df), df.columns] | columns 명령에 리스트 하나면 속성(칼럼) 한 줄이 되지만, 여기에 2차원리스트를 넣으면 2중, 3중 속성을 만들 수 있다. | ||||||||
이중칼럼 접근 | df[('상위칼럼','하위칼럼')] |
3.3 인덱스 조작
의도 | 방법 | 설명 |
---|---|---|
인덱스를 데이터화 | 데이터프레임.reset_index | 숫자 인덱스가 아닌 경우 사용. 인덱스 목록을 뽑아낼 때의 사전작업.
(엑셀에서 불러왔을 때 필요하다.) |
인덱스리스트 얻기 | list(데이터프레임['인덱스열이름'])
데이터프레임.index |
위에서 얻은 인덱스 열이름을 기입해 넣거나('Unnamed: 0'),
바로 인덱스를 불러오기.(둘 다 시도해 볼 것.) |
인덱스 이름 바꾸기 | 데이터프레임.rename(columns={'index':'신이름'}) | |
데이터 크기 살피기 | len(df.index) | |
인덱스 이어붙이기(행 합치기) | df = pd.concat([df1, df2, df3,...]) | 이렇게 쓰면 인덱스들을 이어붙인다. |
3.4 데이터 접근
의도 | 방법 | 설명 |
---|---|---|
칼럼 접근 | 데이터프레임["열이름"] | |
행접근 | 데이터프레임.loc["인덱스"] | 데이터프레임.index['인덱스']형태로 접근도 가능하다.
loc을 쓰지 않으면 하위속성(칼럼)에서 해당 속성을 찾는다.(열 선택) |
행접근(정수인덱스) | df.iloc[정수] | 순서에 따른 정수인덱스를 사용할 수 있다. |
칼럼목록 | 데이터프레임.columns
칼럼목록을 얻는다. |
|
행목록 | 데이터프레임.index
인덱스 목록을 얻는다. |
|
특정 데이터 접근 | 데이터프레임['열이름'][숫자] | 열 이름의 '숫자'번째 요소에 접근한다.
한 줄일지라도 시리즈 형태로 반환한다. 그 시리즈에서 하위 속성에 접근하는 방식이다. |
특정 데이터 접근2 | df['열이름']['찾을내용'] | 열을 찾은 후 해당 내용을 찾는다. |
특정 데이터 접근3 | df.loc['행이름']['열이름'] | 행을 찾고 열을 찾는다. |
상위 5개 데이터 확인 | 데이터프레임.head() | |
조건 인덱싱1 | [데이터프레임['열이름'] > 숫자] | 숫자 이상의 값을 가진 값만 추출한다.
이외 == 등의 조건으로 인덱스를 추출할 수 있다. 인덱스가 조건을 통과했는지 여부를 True, False로 보여준다.
|
조건 인덱싱2 | 데이터프레임 = 데이터프레임[데이터프레임['열이름'] | 조건에 맞는 행만 살린다. |
3.5 전체 틀 조작
의도 | 방법 | 설명 |
---|---|---|
데이터프레임 정렬 | 데이터프레임.sort_values(by = '열이름', ascending = True) | ascending 옵션이 True면 오름차순 |
3.6 데이터 조작
의도 | 설명 | 예시 |
---|---|---|
데이터 정렬 | ascending = False를 추가하면 내림차순으로 정렬한다. | df = df.sort_values(by='열이름') |
필터링 | ||
행간 연산 | .shift(n) n에 해당하는 만큼 데이터를 밀어낸다. | df['열'] - df['열'].shift(1) 형식으로 해당 열의 전 값과 연산할 수 있다. |
과거 데이터의 평균 | 적용할 함수로 숫자만큼의 과거데이터를 연산하여 만든다.
데이터프레임['열이름'].rolling(window=숫자).함수명() 이후 열 추가 등의 처리를 해준다. 여러 데이터의 평균을 구하거나 최대, 최솟값 찾기에 사용한다. |
df2= df['열이름'].rolling(window=5).mean() |
전치 | df.T | 행과 열을 바꾼다. |
3.7 데이터 검색
의도 | 방법 | 설명 |
---|---|---|
인덱스 찾기 | df[행이름 == 값] | 해당 검색결과에 해당하는 인덱스를 구할 수 있다.
df.열이름/ df.열이름['인덱스'] 형태의 연산도 가능하다. |
3.8 행 순회
for ntp in df.itertuples():
ntp.속성명 + ntp.속성명2
튜플화 하여 속성명으로 데이터에 접근해 연산이 가능하다.
3.9 데이터 형식
[다양한 형식이 있을 텐데.. 찾아 조금 채워보자.]
의도 | 방법 | 설명 |
---|---|---|
시계열 데이터로 | df.index = pd.to_datetime(df.index) | 20200322와 같은 숫자는 그냥 문자열로 취급된다. 이를 시계열로 인식되게 하려면 데이터 변환을 해주어야 한다. |
숫자형데이터 | df['열이름'] = pd.to_numeric(df['열이름']) | 해당 데이터가 숫자임을 알려주는 것. |
4 자료 읽어오기
4.1 엑셀과 연동
2차원 데이터를 다루는 가장 쉬운 방법은 엑셀을 이용하는 것. 저장하고 시각화 하는 데 엑셀을 이용한다면 굉장히 편리할 것이다.
엑셀 관련기능을 사용하려면 관련 라이브러리를 설치해야 한다.
의도 | 방법 | 설명 |
---|---|---|
파일 불러오기 | 객체 = pandas.read_excel('c:\\경로.xlsx')
객체 = pandas.read_csv('c:\\경로.csv') |
pip install xlrd 따위의 라이브러리 설치가 선행되어야 한다.
저장했던 엑셀파일을 불러오면 저장한 df 그대로 사용되는 게 아니라, 엑셀의 제한된 기능에 따라 변형되기 때문에 칼럼을 다시 만져주어야 제대로 사용할 수 있다. 기본적으로 맨 윗줄을 칼럼 처리한다.(상관없으면 그냥 쓰고;) 때문에 df['열이름'] = pd.to_numeric(df['열이름']) 형태로 데이터형을 다시 통일, 설정해주어야 한다.
Sheet_name='시트명' 옵션으로 해당 시트를 열 수도 있다. |
파일 저장하기 | 객체.to_excel('c:\\경로.xlsx')
객체.to_csv('c:\\경로.csv') |
pip install openpyxl 따위의 라이브러리 설치가 선행되어야 한다. |
4.2 html 표 불러오기
의도 | 방법 | 설명 |
---|---|---|
데이터 불러오기 | 객체 = pandas.read_html(html 문서) | html 문서의 데이터타입은 str이어야 한다. requests 등으로 웹문서를 불러와 변환해 넣으면 된다. |
표형 데이터는 쉽게 가져올 수 있다.
page = requests.get(url)
tables = pd.read_html(page.text)
[굳이 .text 속성에 접근해야 하네;;? 그냥 객체와 text속성은 어떻게 다른지 보자.]
여러 테이블이 있는 경우, 데이터프레임이 들어있는 리스트로 반환된다.
4.3 결측치 처리
NaN 처리.
fillna() 함수를 사용한다.
df = df.fillna(method='옵션')
옵션 | 설명 |
---|---|
bfill(backward) | 뒤에 있는 값으로 NaN을 덮어쓴다. 마지막 데이터가 NaN이라면 처리 불가 |
ffill(foreward) | 앞의 있는 값으로 덮어쓴다. 처음 데이터가 NaN이면 처리 불가.
따라서 위의 옵션을 둘 다 써서 빈틈이 없게 만드는 게 일반적. |
dropna() 함수로 NaN이 있는 행을 제거하는 방법도 있다.
4.4 이외 활용
의도 | 방법 | 설명 |
---|---|---|
순위 얻기 | 내장함수인 .rank()를 사용한다.
ascending=False 옵션을 줄 수 있다. |
df['열이름'].rank() |
df.pct_change() # 일간 변동률?? 뭐하는 거지? |