728x90
pandas 라이브러리
데이터 조작 및 분석을 위한 라이브러리
- Series Class : 1차원
:인덱스 + 값 - DataFrame Class : 2차원
:행과 열을 가지는 표와 같은 형태
:서로 다른 종류의 자료형을 저장 할수있음
import pandas as pd로 임폴트하고 보통 pd로 불여부른다.
import pandas as pd
Series 사용(1차원)
list1 = [996231, 654615, 452305, 44645]
city = ['서울', '부산', '인천', '대구']
population = pd.Series(list1, index = city)
population
Series 값, 인덱스, 데이터 타입 확인
population.values # 값 확인
population.index # 인덱스 확인
population.dtype # 데이터 타입확인
Series 이름 지정
# Series에 이름 지정
population.name = "인구"
population.index.name = "도서"
population
Series 연산
# Series연산
# 1) Series와 단일값끼리 연산
# 2) Series와 Series끼리의 연산
population / 100000
population >= 100000
# Series와 Series끼리의 연산을 위해
# data, data2라는 2개의 Series를 만들어줌
data = {"아구몬": 9631482,
"피요몬": 3393191,
"텐타몬": 1490158,
"가트몬": 2632035}
digimon = pd.Series(data)
data2 = {"아구몬": 9946312,
"피요몬": 3443451,
"텐타몬": 2460115,
"니드몬": 2892013}
digimon_levelup = pd.Series(data2)
# Series와 Series연산--같은 인덱스를 가진 value끼리 연산을 진행
digimon - digimon_levelup
.notnull(): 비어있지않은 데이터만 보여줌, 비어있는 값(결측치)이면 False, 그외 True
.isnall(): 비어있는 데이터만 보고싶을때 사용
attack = digimon_levelup - digimon
# attack.notnull(): 비어있는 값(결측치)이면 False, 그외 True
bol = attack.notnull()
attack[bol]
# 비어있는 데이터들만 보려면?
# Series.isnull()
bol = attack.isnull()
attack[bol]
Series 값 수정
# Series 값 수정
rp['아구몬'] = 1.6
# Series 값 추가
rp['파닥몬'] = 5.5
# Series 값 삭제
del rp['파닥몬']
rp
Series 인덱싱
# Series 인덱싱
# 1) 순서로 인덱싱
# 2) index로 인덱싱
population[1], population["부산"]
population[3], population['대구']
# 여러개 요소 인덱싱
population[[0, 3, 1]] # 지정해준 순서대로 인덱싱
population[['서울', '대구', '부산']]
population >= 250000
population[population >= 250000]
pandas에서 논리연산자
- &는 and
- |는 or
DataFrame 사용
data = {'2015': [9904312, 3448737, 2890451, 1254876],
'2010': [9631482, 3393191, 2632035, 2431884]}
df = pd.DataFrame(data)
df
인덱스 이름 넣기
df.index = ('서울', '부산', '인천', '대구')
df
데이터프레임 생성시 인덱스와 컬럼 이름지정
data = [[9904312, 3448737, 2890451, 1254876],
[9631482, 3393191, 2632035, 2431884]]
ind = ['2015', '2010']
col = ['서울', '부산', '인천', '대구']
df2 = pd.DataFrame(data, index = ind, columns = col)
df2
data = [[9904312, 3448737, 2890451, 1254876],
[9631482, 3393191, 2632035, 2431884]]
df2 = pd.DataFrame(data, index = ['2015', '2010'],
columns = ['서울', '부산', '인천', '대구'])
df2
데이터프레임 에서 컬럼을 인덱스로 설정
- .set_index(): 컬럼을 인덱스로 바꿔주는 함수
아래와 같이 사용한다.
info = {"순위":rank, 'title' : songList, 'singer' : singerList}
music = pd.DataFrame(info)
# .set_index(): 컬럼을 인덱스로 설정
music = music.set_index('순위')
데이터프레임을 만들때 인덱스 설정
- index 속성 사용
info = {"순위":rank, 'title' : songList, 'singer' : singerList}
music = pd.DataFrame(info, index = rank)
데이터프레임 전치
df2.T # 데이터프레임.T: 전치함수 (행과 열을 뒤집어줌)
데이터프레임 값, 인덱스, 컬럼 확인
# DataFrame 값 확인
df.values
# DataFrame 인덱스 확인
df.index
# 결과: Index(['서울', '부산', '인천', '대구'], dtype='object')
# dtype에서 object는 ---> 거의 문자열을 나타낸다
# DataFrame 컬럼 확인
df.columns
DataFrame 인덱싱
- loc[ ]인덱서: 인덱스를 통해 접근
- iloc[ ]인덱서 : 순서를 통해 접근
이름으로 인덱싱 | 기본형태 | 단축형태 |
하나의 row이름 | df.loc["row1"] | |
row이름의 리스트 | df.loc[["row1", "row2", "row3"]] | |
row이름의 리스트 슬라이싱 | df.loc["row2":"row5"] | df["row2":"row5"] |
하나의 column이름 | df.loc[:, "col1"] | df["col1"] |
column 이름의 리스트 | df.loc[:, ["col1", "col2", "col3"]] | df[["col1", "col2", "col3"]] |
column이름의 리스트 슬라이싱 | df.loc[:, "col2":"col5"] |
위치로 인덱싱 | 기본형태 | 단축형태 |
하나의 row 위치 | df.iloc[8] | |
row 위치의 리스트 | df.iloc[[4, 5, 3]] | |
row 위치의 리스트 슬라이싱 | df.iloc[2:5] | df[2:5] |
하나의 column 위치 | df.iloc[:, 3] | |
column 위치의 리스트 | df.iloc[:, [3, 5, 6]] | |
column 위치의 리스트 슬라이싱 | df.iloc[:, 3:7] |
Pandas Boolean 인덱싱
df['2010'] >= 2500000
df[df['2010'] >= 2500000] # 불리언 시리즈를 통해 인덱싱을 진행하면
# 시리즈에서 True값을 가지는 index 데이터만 표기
csv 파일 불러오기
# csv파일 불러오기
population_number = pd.read_csv('./data/population_number.csv', encoding = 'euc-kr')
# 불러올때 도시를 인덱스로 사용지정
population_number = pd.read_csv('data/population_number.csv',
index_col = ('도시'), encoding = 'euc-kr')
population_number
# 컬럼명 확인
# 도시를 인덱스로 사용한다고 빼버려서 컬럼에서 빠진걸 볼 수 있다.
population_number.columns
횟수 세기
- value_counts 함수: 값(value)이 숫자, 문자열, 카테고리 값인 경우에, 각각의 값(value)이 나온 횟수를 세는 기능
# 시리즈.value_counts 함수: 값(value)이 숫자, 문자열, 카테고리 값인 경우에,
# 각각의 값(value)이 나온 횟수를 세는 기능
population_number['지역'].value_counts()
맨앞과 맨뒤만 보기
- head() : 맨앞부터 n까지만 보여줌, 디폴트는 5
- tail() : 맨뒤부터 n까지만 보여줌, 디폴트는 5
정렬
데이터프레임/ 시리즈.sory_index함수: 인덱스 이름(값)을 기준으로 오른차순 정렬 방법
# 정렬
# 데이터프레임/ 시리즈.sory_index함수: 인덱스 이름(값)을 기준으로 오른차순 정렬 방법
population_number.sort_index()
시리즈.sort_values(): 데이터 값(value)을 기준으로 정렬
ascending 옵션: True일때 오름차순 정렬, False일때 내림차순 (True가 디폴트)
# 시리즈.sort_values(): 데이터 값(value)을 기준으로 정렬
# ascending 옵션: True일때 오름차순 정렬, False일때 내림차순 (True가 디폴트)
population_number['2010'].sort_values(ascending=False)
# 결측치는 정렬대상에서 제외, 마지막에 온다
# 데이터프레임.sort_values(): 데이터 값(value)을 기준으로 정렬
# 데이터프레임에서는 기준이 되는 컬럼 설정
population_number.sort_values(by = '2010', ascending = False)
# by = _____을 기준으로 설정
# 여러개의 컬럼값을 기준으로 정렬
population_number.sort_values(by = ['지역', '2010'])
# by=['지역', '2010']을 하면 먼저 지역을 기준으로 정렬하고 같은값인 경우 2010을 기준으로 정렬된다
score.csv 파일 불러오기
score = pd.read_csv("data/score.csv", encoding = "euc-kr", index_col = '과목')
# 열별(학급별) 합계
score.sum()
# 열별(학급별) 합계 순위
score.sum().sort_values(ascending = False
# 행별(과목별) 합계
score.sum(axis = 1) # axis 옵션: 연산을 진행할 방향 (디폴트는 0)
# 행별(과목별) 합계 순위
score.sum(axis = 1).sort_values(ascending = False)
# 과목별 합계를 데이터프레임에 추가하기
score['합계'] = score.loc[:'Web','1반':'4반'].sum(axis = 1)
score
# 반별 합계를 데이터프레임에 추가
score.loc['반합계'] = score.loc['파이썬':'Web',:'4반'].sum()
score
열/ 행 삭제하는 방법 : drop
axis = 0이면 인덱스 삭제, axis = 1이면 컬럼 삭제
score.drop('반합계', axis = 0, inplace = True)
df.apply(func, axis = 0 or 1)
- 행이나 열 단위로 더 복잡한 처리를 하고 싶을 때 사용
- pandas의 객체에 다른 라이브러리 함수를 적용하는 방법
- pandas 객체에 열 혹은 행에 대해 함수를 적용하게 해주는 함수
def max_min(s):
dif = s.max() - s.min()
return dif
score.loc[:'Web', :'4반'].apply(max_min, axis = 1)
결측치를 0으로 바꿔보자.
# fillna(원하는 값)
# 결측치(NaN)를 원하는 값으로 바꿔주는 함수
population_number.fillna(0, inplace = True)
population_number
데이터프레임 병합
- concat 함수
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']},
index=[8, 9, 10, 11])
display(df1)
display(df2)
display(df3)
# concat시 keys를 부여하면 다중 index가 된다.
result = pd.concat([df1, df3, df2], keys =['x', 'y', 'z'])
result
# 멀티인덱싱에 대해 접근하기 위해선 튜플로 멀티인덱스를 사용하여 접근 가능
result.loc[('y', 8)]
result.index.get_level_values(1)
병합 : axis가 0일 때와 1일 때
join 속성
# join = 'inner': 데이터프레임 끼리 겹치는 것만 보여줌
result = pd.concat([df1, df4], axis = 1, join = 'inner')
result
# ignore_index: 기존의 인덱스를 무시하고 새로운 인덱스 부여(0~)
pd.concat([df1, df4], ignore_index =True)
concat(): 인덱스/컬럼에 영행을 받아 데이터프레임 병합
merge(): 값을 기준으로 병합
df5 = pd.DataFrame({'key': ['K0', 'K2', 'K3', 'K4'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
df6 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
pd.merge(df5, df6, on ='key') # 둘다 있는것만 표시
pd.merge(df5, df6, on ='key', how = 'outer') # 전부 표시
pd.merge(df5, df6, on ='key', how = 'left') # 왼쪽 전부표시
pd.merge(df5, df6, on ='key', how = 'right') # 오른쪽 전부표시
728x90
'파이썬 > Data Science' 카테고리의 다른 글
[Data Science] 데이터 퀄리티 높이기 (0) | 2021.06.18 |
---|---|
[Data Science] 큰데이터 프레임/큰 시리즈를 살펴볼때 도움이 되는 함수 (0) | 2021.06.06 |
[Data Science] numpy라이브러리 사용하기 [스마트인재개발원] (0) | 2021.06.02 |
[Data Science] 데이터 사이언스 프로세스 (0) | 2021.05.31 |