파이썬/Data Science

[Data Science] pandas라이브러리 정리

취준생코린이 2021. 6. 6. 18:21
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