pandas
자료구조
- Series 와 Datafame
- numpy의 ndarray는 행이나 열을 구분하는 것이 정수로 된 인덱스인데 pandas의 자료구조들은 index를 직접 설정가능
1.Series
1) 생성
Series(data, index=None, dtype=None, copy=False)
- data는
__iter__
가 구현된 객체 - index는 데이터 별 이름을 부여하는 것인데 생략하면 0부터 시작하는 숫자
- dtype은 각 요소들이 자료형인데 생략하면 유추해서 설정
copy는 복제 여부
data에 dict를 대입하면 key가 index가 되고 value가 데이터로 설정됩니다.
- values 속성을 호출하면 데이터만 추출해서 numpyt의 ndarray로 리턴합니다.
- index 속성을 호출하면 index들을 리턴하는데 직접 설정도 가느
- 각각의 데이터는 [인덱스]를 이용해서 접근
- 범위에 해당하느 ㄴ데이터에 접근할 때는 [정수인덱스:정수인덱스]의 경우 정수 인덱스 앞까지이지만 인덱스를 문자열로 생성해서 대입하는 경우 [문자열인덱스:문자열인덱스]는 마지막 문자열인덱스를 포함
[0:4] -> 0부터 3까지
['apple':'mango'] -> apple 부터 mango 까지
- 인덱스 자리에 list를 대입해서 list에 포함된 인덱스들의 데이터만 추출가능
from pandas import Series, DataFrame
# Series 와 DataFrame을 제외하고 pd로 접근
import pandas as pd
#Series 만들기
good1 = Series([1000, 1500, 500])
print(good1)
#데이터 접근
print(good1[0]) #1개의 데이터 접근
print(good1[0:2]) #연속된 범위의 데이터 접근
print(good1[[0,2]]) # 불연속된 데이터 접근
# 인덱스 설정
good1.index = ['orange', 'Apple', 'Banana']
print(good1)
print(good1['orange' : 'Banana'])
#orange 부터 Banana 까지
2) 연산
- Series와 Scala Data 의 연산은 Broadcast 연산(각각의 요소와 연산해서 결과를 Series로 리턴)
- Series 끼리의 연산은 index를 기준으로 연산
- None(numpy.nan)과의 연산은 결과가 무조건 None
- 없는 index 와의 연산의 결과도 None
good1 = Series([100, 200, 150], index=['1', '2', '3'])
good2 = Series([10, 20, 15], index=['1', '2', '4'])
print(good1 + 200) # 모든 요소에 200을 더함
print(good1 + good2) # 인덱스가 동일한 데이터끼리 연산
# 인덱스가 동일한 데이터끼리 연산
# 1번과 2번은 양쪽에 같이 있어서 더하기
# 3과 4번은 한쪽에만 존재하기 때문에 None
2. DataFrame
- 인덱스와 컬럼이름을 가진 행렬(2차원 배열) - 테이블이라고 많이함.
- 이름(인덱스)을 갖는다
- 통계에서 주로 사용
- dict 의 list와 유사함.
- 외부 데이터를 가지고 생성하는 경우가 많고 직접 생성하는 경우는 dict를 주로 이용
- 하나의 key에 list 형태의 value를 설정해서 생성
# 디셔너리를 생성
items = {'name': ['oragne', 'mango'], 'price': [2000, 2500], 'manufacture': ['korea', 'taiwan']}
#DataFrame을 생성
df = DataFrame(items)
print(df)
1) 생성가능한 데이터
- dict
- 2차원 ndarray
- ndarray, list, tuple, dict, Series 타입을 value로 갖는 dict
- dict, Series의 list
- list, tuple의 list
2) index
- 행에 붙이는 이름
- 직접 설정을 하지 않으면 0부터 시작하는 정수로 된 인덱스가 생성
- 생성할 때 index 매개변수를 이용해서 직접 설정 가능
- 생성한 후 index 속성을 이용해서 설정 가능
3) 컬러밍름
- 열에 붙이는 이름
- 직접 설정하지 않으면 디폴트로 생성 : dict의 경우는 key가 컬럼이름으로 설정되고 그 이외의 정수로 설정
- 생성할 때 columns 매개변수를 이용해서 설정 가능
- 생성한 후 columns 속성을 이용해서 설정 가능
4) 테이블의 데이터 일부 확인
head(데이터 개수) : 앞에서 부터 데이터 개수만큼 리턴
tail(데이터 개수) : 뒤에서 부터 데이터 개수만큼 리턴
5) info()
- DataFrame의 개요 리턴
- 외부에서 데이터를 가져와서 DataFrame을 만들 때 head나 tail을 이용해서 데이터가 제대로 불러져 왔는지 확인하고 데이터이ㅡ 개요를 확인하기 위해서 info()를 호출해서 출력
# 디셔너리를 생성
items = {
'name': ['oragne', 'mango','apple', 'banana'],
'price': [2000, 2500, 3000, 1500],
'manufacture': ['korea', 'taiwan', 'korea', 'vetnum']
}
# DataFrame을 생성
df = DataFrame(items)
df.index = np.arange(10, 50, 10) # 인덱스를 직접 설정
print(df.head(3)) # 3개의 데이터 확인
print(df.info()) # 개요 확인
- info 해석
<class 'pandas.core.frame.DataFrame'> # 전체 데이터의 자료형
Int64Index: 4 entries, 10 to 40 # 행의 개수와 인덱스 (행의개수와 데이터데개수가 다르면 None이 있다)
Data columns (total 3 columns): # 컬럼의 개수
name 4 non-null object # name컬럼은 4개의 데이터가 존재, 자료형은 객체(문자열)
price 4 non-null int64 # price컬럼은 4개의 데이터가 존재, 자료형은 정수
manufacture 4 non-null object # manufacture 컬럼은 4개의 데이터가 존재, 자료형은 객체(문자열)
dtypes: int64(1), object(2) # 1개의 컬럼은 정수로 되어있고 2개의 컬럼은 객체
memory usage: 128.0+ bytes # 메모리 사용량
6) 패키지에 제공되는 데이터 해석
- scikit-learn 및 seaborn 등 파이썬 라이브러리에서 제공하는 데이터 셋
- scikit-learn: https://scikit-learn.org/stable/datasets/index.html#toy-datasets
- load_digits(): 숫자 데이터
- load_boston(): 보스톤 주택 가격에 대한 데이터
- load_iris: 붓꽃 분류 데이터
- load_diabetes(): 당뇨병 데이터
- load_wine(): 와인 품질 데이터
- load_breast_cancer(): 유방암 데이터
- 캐글: https://www.kaggle.com
- scikit-learn: https://scikit-learn.org/stable/datasets/index.html#toy-datasets
- UCI 머신러닝 저장소: https://archive.ics.uci.edu/ml/index.php
- 공공 데이터
# sklearn에서 제공하는 boston 주택 가격 데이터 가져오기
from sklearn import datasets
# boston 데이터 셋을 가져오기
boston = datasets.load_boston()
# 자료형 확인
print(type(boston))
# 데이터 확인
print(type(boston.keys)) # 키의 자료형 확인
print(boston.keys())
print(type(boston.data)) # 실제 데이터의 자료형 확인
# DataFrame으로 생성가능한지 확인 -> shape 확인 (2차원이면됨)
print(boston.data.shape) # 506행 13열 -> 2차원
df = DataFrame(boston.data)
print(df)
# DataFrame 으로 변환 (컬럼입히기)
# 가져온 데이터 셋이 ndarray 인 경우 데이터를 파악하기가 어려울 수있어서
# 컬럼 이름을 부여한 DataFrame으로 가지고 있는것이 데이터 파익이 용이하다.
# 머신러닝에 적용할 때는 df.values로 다시 ndarray로 만들면 된다.
df = DataFrame(boston.data,
columns=['CRIM', 'INDUS', 'NOX', 'RM', 'LSTAT',
'BLACK', 'PTRATIO', 'ZN', 'CHAS', 'AGE',
'RAD', 'DIS', 'TAX'])
print(df)
컬럼출처 : https://datascienceschool.net/view-notebook/4b948c4d99c94213bf02bcff2ced88eb/
7) fwf 파일
- 텍스트 파일인데 글자 수가 일정한 형태로 되어 있는 파일
pandas.read_fwf
,pandas.read_txt
,pandas.read_csv
등등
# 배치
pandas.read_fwf(
파일경로,
widths=(글자수 나열),
names=(컬럼이름 나열),
encoding=인코딩방식)
- 파일이 windows에서 기본 인코딩으로 만들어진 것이면 cp949(ms949)이고 그 이외의 운영체제에서 만들어진 것이면 utf-8
fwf = pd.read_fwf(
'../data/data_fwf.txt',
width=(10,2,5),
names=('날짜', '종목이름', '종가'),
encoding='utf-8')
print(fwf)
8) csv파일 읽기
- read_csv : 기본 구분자가 ,로 설정
- read_table : 기본 구분자가 Tab
- 옵션 설정이 없으면 첫번째 행의 데이터가 컬럼이름이 됨니다.
#item.csv 파일을 읽어서 DataFrame 만들기
item = pd.read_csv('../data/item.csv')
print(item.head())
print(item.info())
- read_csv 의 매개변수
- path : 파일의 경로
- sep : 구분자(기본은 , )
- header : 컬럼이름의 행 번호로 기본값은 0, 첫번째 행이 컬럼이름이 아닌 경우는 None으로 설정
- index_col : 인덱스로 사용할 컬럼 번호나 컬럼 이름
- names: 컬럼 이름으로 사용할 리스트로 header=None과 함께 사용
- skiprows : 읽지 않을 행의 개수
- nrows : 일부분만 읽는 경우 읽을 행의 개수
- skip_footer : 마지막에 읽지 않은 행의 개수
- encoding : 인코딩 종류를 지정 - UTF-8로 인코딩 된 텍스트일 경우 'utf-8'로 지정
- squeeze : 행이 하나인 경우 Series객체를 만드는데 이 속성의 True로 설정하면 DataFrame으로 생성
- thousands : 숫자를 천 단위로 끊을 때 ',' 나'.' 같은 구분자, 천단위기호가 있는 데이터를 읽으면 문자열로 읽게 된다.
- na_values : None 처리할 데이터의 list
- comment : 주석으로 분류되어 파싱하지 않을 문자 혹은 문자열
- converters : 변환 시 칼럼에 적용할 함수를 지정
- parse_dates : 날짜 형식의 데이터를 datetime으로 변환할지 여부
파일을 처음 볼때 천단위기호(문자열인식의문제), 한글 있는지(인코딩의문제) 여부 확인
# good.csv 파일을 읽어서 DataFrame 만들기
good = pd.read_csv(
'../data/good.csv',
header=None,
names=['제품명', '수량','가격'])
print(good.head())
print(good.info())
- 텍스트 파일의 용량이 큰 경우(데이터가 많은 경우)
- log 분석을 하기 위해서 csv를 읽어오는 경우 실무에서 사용하는 데이터는 아주 큰 용량입니다.
- 한국 ebay의 경우 하루 로그기록하는 파일의 사이즈가 대략 8GB 정도 됩니다.
- 이런 정도의 파일을 한 번에 읽어서 DataFrame을 만들게 되면 시스템이 멈추거나 아주 느리게 작업이 이뤄지게 됩니다.
- 이런 파일은 분할해서 읽어야 한다.
- nrows와 skiprows를 이용할 수 있다.
- 읽을 때 chunksize(한 번에 읽을 행이 개수)를 설정 - 이 옵션은 설정하면 TextParser 객체가 리턴
- TextParser를 iterator(for)를 돌리면 chunksize 단위로 데이터를 가져오게 된다.
# good.csv 파일의 내용을 2개씩 읽어오기
goodchunk = pd.read_csv(
'../data/good.csv',
chunksize=2,
header=None)
for two in goodchunk :
print(two)
- 결과값 - 2줄씩 나눠서 읽는다.
0 1 2
0 apple 10 1500
1 banana 5 15000
0 1 2
2 melon 7 1000
3 kiwi 20 500
0 1 2
4 mango 30 1500
5 orange 4 700
- 문자열이 작은 따옴표나 큰 따옴표로 묶여 있는 경우 또는 구분자가 1글자가 아니고 여러 글자인 경우
read_csv
가 제대로 데이터를 읽지 못하는 경우가 발생할 수 있습니다.- csv모듈의 reader 객체를 이용해서 줄 단위로 읽어서 처리를 해야됨니다.
# 문자열이 작은 따옴표로 묶여 있는 경우
fruits = pd.read_csv(
'../data/fruit.csv',
header=None,
sep='|') # sep="|" 구분자를 주고 읽어오기
print(fruits)
# 줄단위로 읽어서 DataFrame 만들기 (위에방법이 잘안되면)
import csv
lines = list(csv.reader(open('../data/fruit.csv'), delimiter='|'))
print(lines)
fruits = DataFrame(lines, columns=['이름', '수량', '가격'])
print(fruits)
9) csv 저장
- series 나 DataFrame 객체가 to_csv 함수를 호출
- 첫번째 매개변수는 파일 경로
- sep는 저장될 때의 구분자를 설정
- na_rep는 None 값을 어떻게 출력할 것인지를 설정
- index = None을 설정하면 인덱스는 출력되지 않음
- header = None 을 설정하면 컬럼이름이 출력되지 않음
- cols 에 컬럼이름의 list를 설정하면 설정ㅇ한 컬럼들만 출력
# 파일에 저장
fruits.to_csv(('fruits.csv'), index=None, header=None)
10) excel 파일 읽기
- anaconda 를 설치하지 않은 경우에는 xlrd 패키지를 설치해야 한다.
pandas.read_excel(엑셀파일경로)
pandas.io.excel.read_excel(엑셀 파일경로)
- 함수이름은 같은데 모듈이 다름
- 함수들의 매개변수는
read_csv
와 유사한데sheet_name
옵션에 읽을 sheet 이름을 설정해야 한다.
11) excel 파일 저장
- ExcelWriter 객체를 만들고
DataFrame.to_excel(ExcelWrite객체, sheer_name='시트이름')
실습
- excel.xlsx 파일 읽기
- 한글이 포함되어 있고 첫번째 줄이 컬럼의 이름인 것을 확인, sheet이름은 Sheet1, 인코딩을 고려한다.
#엑셀 파일 읽고 쓰기
excel = pd.read_excel('../data/excel.xlsx', sheet_name='Sheet1')
# , encoding='utf-8'
print(excel)
# 엑셀 저장
writer = pd.ExcelWriter('excel2.xlsx')
excel.to_excel(writer, sheet_name='연습')
writer.save()
12) HTML 페이지의 table 태그의 내용을 DataFrame으로 변환
pandas.read_html(경로)
- 천단위 구분기호 설정, 인코딩 방식, na 데이터 설정 등의 옵션이 있다.
- 하나의 페이지에 table 태그가 여러개 있을 수 있기 때문에 DataFrame의 list로 리턴
세계인구 https://ko.wikipedia.org/wiki/%EC%9D%B8%EA%B5%AC%EC%88%9C_%EB%82%98%EB%9D%BC_%EB%AA%A9%EB%A1%9D
#pandas 의 read_html 함수 도움말
#help(pd.read_html)
li = pd.read_html('https://ko.wikipedia.org/wiki/%EC%9D%B8%EA%B5%AC%EC%88%9C_%EB%82%98%EB%9D%BC_%EB%AA%A9%EB%A1%9D', thousands=',')
# list가 와서 다른 형태로 써야됨
for df in li :
print(df.head())
print(li[0])
13) json 데이터 읽기
- pandas.read_json을 이용해서 읽기
- 대다수의 데이터는 배열의 형태가 아니고 일반 객체 형태라서 바로 만들면 나중에 가공작업이 필요한 경우가 많다.
list : 인덱스로 구분 0, 1, 2, 3~ dict : key로 구분
# json 데이터 읽기
movies = pd.read_json('http://swiftapi.rubypaper.co.kr:2029/hoppin/movies?version=1&page=1&count=20&genreId=&order=releasedateasc')
# key를 확인해서 list를 찾아라!
print(movies)
print(movies['hoppin'])
print(movies['hoppin']['movies'])
print(movies['hoppin']['movies']['movie'])
for temp in movies['hoppin']['movies']['movie'] :
print(temp['title'])
14) xml 읽기
- pandas에는 xml을 읽어서 만드는 함수는 없습니다.
- 이 경우에는 xml 파싱을 수행한 후 직접 만들어야 한다.
15) RDBMS 활용
- 데이터베이스의 데이터를 가지고 DataFrame 만들기
sqlalchemy 패키지 : 관계형 데이터베이스에 접속해서 sql을 실행시켜서 데이터를 가져오는 패키지
sqlalchemy 패키지를 이용한 데이터베이스 연결 객체 만들기
from sqlalchemy import create_engine
연결객체 = create_engine(데이터베이스 URL)
- sql을 이용한 DataFrame 만들기
pandas.read_sql_query(SQL 구문, 연결객체)
: sql 구문 수행 결과를 가져오는 함수pandas.read_sql_table(table 구문, 연결객체)
: 테이블의 데이터를 전부 가져오는 함수
16) SQLLite3 의 PL 테이블의 데이터 가져오기
# sqllite3 의 데이터 가져오기
from sqlalchemy import create_engine
# 연결객체생성
con = create_engine('sqlite:///data/sample.db')
#sql을 샐행해서 DataFrame 만들기
pl = pd.read_sql('select * from pl', con)
print(pl)
17) 오라클의 데이터 가져오기
- cx_Oracle 이라는 패키지가 필요
- Mac에서는 바로 접근이 안되서 Oracle 홈페이지에서 instant client 라는 프로그램을 다운로드 받아서 설치한 후 /opt 디렉토리에 oracle 디렉토리를 생성하고 받은 파일의 압축을 해제
- 압축해제한 디렉토리에서 lib 파일들을 /users/local/lib 디렉토리에 복사를 해야 합니다.
- 접속 URL -
oracle://유저ID:유저비밀번호@ip:port/sid
18) mysql 에서 데이터 가져오기
- pymysql 이라는 패키지가 필요
- 접속 URL -
mysql+mysqldb://유저ID:유저비밀번호@ip:port/dbname
3.DataFrame 에서의 선택
1) 열 선택
- 하나의 열은
DataFrame[열이름]
또는Dataframe.열이름
으로 접근 -> Series가 리턴 - 여러 개의 열은
DataFrame[[열이름 나열]]
-> DataFrame 이 리턴 - DataFrame[열이름:열이름] -> 마지막 열이 포함됩니다. -> DataFrame이 리턴
2) 행 선택
iloc[행의 위치]
loc[인덱스]
- list 형태나
:
을 이용한 범위형태 가능 - 하나의 행인 경우는 Series로 리턴되고 2개 이상인 경우는 DataFrame으로 리턴
- list 형태나
3) 셀 선택
[컬럼이름][행번호]
loc[행인덱스, 열인덱스]
iloc[행번호, 열번호]
#DataFrame에서의 선택
#item.csv 파일의 데이터 가져오기
#item.csv 파일의 내용을 가져오기
item = pd.read_csv('../data/item.csv')
# 컬럼이름 : code,manufacture,name,price
print(item.head())
item.info()
#인덱스 설정
item.index = ['사과', '수박', '참외', '바나나', '레몬', '망고']
print(item['code']) # 하나의 열 선택
print(item[['name', 'price']]) # 여러개 열 선택
#행선택
print(item.loc['사과']) # 인덱스로 접근
print(item.iloc[2, 4]) # 행의 위치로 접근
print(item.loc['사과':'망고']) #인덱스로 접근
print(item.iloc[0:5]) #행의 위치로 접근
4) boolean indexing
- loc에 bool 자료형의 Series를 대입하면 True 인 행 만 추출
- Series는 scala data 와 연산을 하게되면 broadcast 연산을 수행해서 Series로 결과를 리턴
- Series
#price가 1000 이상인 데이터만 추출
print(item[item['price'] >= 1000])
#price가 1000이나 1500인 데이터
print(item[item['price'].isin([1000,1500])])
4. Data 탐색 관련 함수
1) head
- 정수를 대입해서 정수만큼 데이터를 앞에서 부터 리턴
2) tail
- 정수를 대입해서 정수만큼의 데이터를 뒤에서부터 리턴
3) shape
- 행과 열의 수를 tuple로 리턴
4) info
- 데이터의 대략적인 개요
5) dtypes
- 각 컬럼의 자료형을 리턴
6) describe
- 기술 통계 정보를 리턴하는데 include=True 옵션을 추가하면 숫자가 아닌 컬럼의 정보도 리턴
7) count
- 데이터 개수
8) value_counts
- 각 값들의 개수인데 Series에만 사용
9) unique
- 고유한 값 리턴
#데이터 탐색 함수
df = pd.read_csv("../data/auto-mpg.csv")
print(df.head())
# 기술통계 정보
print(df.describe()) # 숫자 데이터의 통계
print(df.describe(include='all')) #문자 포함
# 카테고리 형태의 데이터의 분포 확인
print(df['origin'].value_counts())
5. 기술통계함수
- count, max, min, mean(평균), median(중간값), var(분산), std(표준편차)
- skew(비대칭 - 왜도), kurt(첨도), sem(평균의 표준오차), mode(최빈값)
- argmin, argmax, idxmin, idxmax
- quantile(4분위수 - 25% 50% 75% 값)
- describe(요약 정보)
- cumsum, cumprod, cummax, cummin : 누적
- diff(앞 데이터와의 차이)
- pct_change(앞 데이터와의 차이를 백분율로 출력)
- unique : 고유한 데이터들의 배열 리턴
- DataFrame 에서 axis 옵션을 0이나 1로 설정하면 행과 열방향 반대
- skipna 옵션을 True 로 설정하면 None 값을 제외하고 그렇지 않으면 None 값을 포함
#cyl 컬럼의 평균
print(df['cyl'].mean())
stock = pd.DataFrame({'다음':[1000, 1020, 1940]})
print(stock['다음'].diff()) # 각 행의 차이
print(stock['다음'].pct_change()) # 각행의 차이의 비율
6. 공분산과 상관계수
- 공분산은 cov()
- 상관계수는 corr()
- Series를 이용할 때는 Series 객체가 함수를 호출하고 다른 Series 객체를 매개변수로 대입
- DataFame은 함수만 호출하면 모든 커럼의 공분산이나 상관계수를 출력
1) 공분산(covaiance)
- 2개의 확률 변수의 상관정도를 나타내는 수치
- 분산은 하나의 확률 변수의 이산정도를 나타내는 수치
- 공분산은 2개의 컬럼 사이의 관계를 파악한 수치
- 하나의 컬럼의 값이 증가하는 추세를 보일 때 같이 증가하면 양수이고 감소하면 음수가 됩니다.
- 공분산은 하나의 값이 증가할 때 다른 하나의 값이 얼마나 증가하는지 또는 감소하는지를 수치화
2) 상관계수
- 공분산과 개념은 같은데 값의 범위를 -1 ~ 1까지로 제한
- 하나의 컬럼의 값이 증가할 때 동일한 비율로 증가하면 상관계수는 1
- 하나의 컬럼의 값이 감소할 때 동일한 비율로 증가하면 상관계수는 -1
- 절대값 0.6 이상이면 상관이 높다라고 하고 0.4 정도 이상이면 상관이 있다라고 하고 0.4이하면 상관이 없다라고 한다.
- 상관계수가 0인 경우는 상관이 없다라는 것이지 관계가 없다라는 표현은 아니다.
- 피어슨 상관계수 : 비율을 가지고 구하는 상관계수 - 선형관계인 경우 적합
- 스피어만 상관계수 : 값의 증가와 감소에만 집중하는 상관계수 - 비선형 관계에 적합
- 켄달 순위 상관계수 : 순위를 가지고 상관계수를 구함
3) 상관계수 대신 사용하는 것들
- 산점도나 선 그래프를 그려서 데이터 간의 관계를 파악할 수 있습니다.
#데이터 탐색 함수
df = pd.read_csv("../data/auto-mpg.csv")
print(df.head())
#weight 와 mpg 의 상관계수
# 둘다 음수가 나왔고 0.6 이상이므로 음의 상관관계
print(df['weight'].corr(df['mpg']))
print(df['hp'].corr(df['mpg']))
7. 정렬(sort)
- sort_index() 를 호출하면 인덱스 순서대로 오름차순 정렬
- axis = 1을 대입하면 컬럼의 이름 순서대로 오름차순 정렬
- ascending에서 True를 대입하면 내림차순 정렬
- Series 객체는 sort_value()를 호출
- DataFrame에서 특정 컬럼을 가지고 정렬을 하고자 하는 경우에는 sort_values 함수에 by 매개변수로 컬럼의 이름을 list로 대입하면 됩니다.
# Series의 정렬
print(df['hp'])
print(df['hp'].sort_values()) # 오름차순 정렬
print(df['hp'].sort_values(ascending=False)) # 내림차순 정렬
# DataFrame 정렬
# hp의 오름차순 그리고 값이 같으면 cyl의 오름차순 정렬
print(df.sort_values(by=['hp','cyl']))
8. rank
- 순위를 구해주는 함수
- asending을 False 로 설정하면 내림차순으로 순위를 구함
- 동점인 경우의 순위는 method를 이용해서 설정할 수 있는데 max를 대입하면 큰 순위로 min을 대입하면 작은 순위로 그리고 first를 설정하면 먼저 등장하나 데이터가 작은순위로 대입
점수 min max first
100 - 1 1 1
90 - 4 4 4
93 - 2 3 2
93 - 2 3 3
87 - 5 5 5
9. rename
- 컬럼이나 인덱스의 이름을 변경할 때 사용하는 함수
- index 나 columns 매개변수에 {기존이름:새로운이름...} 의 형태로 대입하면 index 나 columns를 수정해서 새로운 DataFrame을 리턴
- inplace = True 옵션을 추가 하면 함수를 호출한 원본 DataFrame을 변경한다. (중요)
10. 인덱스 재구성
- reindex 속성을 이용해서 인덱스를 재배치 가능
set_index('열이름' 또는 열이름의 list)
: 열로 index로 생성하는데 열은 데이터에서 제거reset_index()
: 인덱스가 제거되고 0부터 시작하는 숫자로 초기화 : 그룹화에서 많이 사용
item = pd.read_csv("../data/item.csv")
print(item)
#순위 출력
print(item.rank())
print(item.rank(method='min'))
print(item['code'].rank(method='min'))
# 컬럼이름 변경
# inplace 옵션을 이용하면 호출한 원본에 적용 가능
item.rename(columns={'code':'코드'}, inplace=True)
print(item)
#코드를 index로 설정 - 데이터에서는 제거
item.set_index('코드', inplace = True)
print(item)