본문 바로가기

데이터 분석/파이썬

[나도코딩] 데이터 분석 및 시각화 - Pandas 요약

https://youtu.be/PjhlUzp_cU0

 

>> pandas 불러오기

import pandas as pd

 

1. series

: 1차원 데이터(정수, 실수, 문자열 등)

> series 만들기
temp=pd.Series([-20,-10,10,20])

> series index 지정
temp=pd.Series([-20,-10,10,20], index=['Jan','Feb','Mar','Apr'])

# 색인
temp['Jan'#index Jan{1월}에 해당하는 데이터 출력

2. DataFrme

: 2차원 데이터(정수, 실수, 문자열 등)

#2차원 데이터 초기화

data={    '이름' : ['채치수','정대만',"송태섭","서태웅","강백호","변덕규","황태산","윤대협"]    
              ,'학교' : ["북산고","북산고","북산고","북산고","북산고","능남고","능남고","능남고"]    
              , '키' : [197,184,168,187,188,202,188,190]    
              ,'국어' : [90,40,80,40,15,80,55,100]    
              ,'영어' : [85,35,75,60,20,100,65,85]    
              ,'수학' : [100,50,70,70,10,95,45,90]    
              ,'과학' : [95,55,80,75,35,85,40,95]    
              ,'사회' : [85,25,75,80,10,80,35,95]    
              ,'SW특기' : ['Python','Java','Javascript','','','C','PYTHON','C#']}

>데이터 프레임 만들기
df=pd.DataFrame(data)

>데이터 접근

#이름과 키값만 출력
df[['이름','키']]

3. Index

 

>> index 지정
# index는 데이터 행 개수와 일치하여야 함
df=pd.DataFrame(data, index=['1번','2번','3번','4번','5번','6번','7번','8번'])
df.index.name="지원번호"  #index 이름 지정



>index 조회 : df.index

>index 초기화 :  df.reset_index(drop=True) => 실제 인덱스에는 반영x
>index 초기화 : df.reset_index(drop=True,inplace=True) => 실제 인덱스에 반영
>index 값 설정 : df.set_index(' 인덱스 이름  ')

>index 정렬 : df.sort_index( ascending = True/False) #인덱스로 오름/내림차순 정렬

4. 파일 저장 및 열기

dataframe 객체를 excel, csv, txt 등 형태의 파일로 저장/열기

- 파일저장
> csv로 저장하기  : df.to_csv('파일명')
> txt로 저장하기  : df.to_text('파일명')
> 엑셀로 저장하기  : df.to_excel('파일명')

#옵션
구분자 설정 : sep
인덱스 컬럼 지정 : index_col

- 파일불러오기
> csv 불러오기  : pd.read_csv('파일명')
> 엑셀 불러오기기  : pd.read_excel('파일명')

#옵션
행 건너뛰기 : skiprows = [1,3,5]   -> 리스트에 있는 행을 건너뜀
읽을 행 수 : nrows 
-> skiprows는 컬럼 헤더를 하나의 행으로 파악
-> nrows는 첫 행을 컬럼 헤더로 설정하고 이후부터 추출

5. 데이터 확인

#dataframe 확인 : df.describe() / df.info()
# 상위/하위 행 확인 : df.head() / df.tail()

# index 확인 : df.index

#column 확인 : df.columns

# 값들 보기 : df.values
#행열 확인 : df.shape


#series 확인
기초통계 : describe() / info()
최소 : min()
최대 : max()
큰 사람 순서대로 n명 : nlargest(n)
평균 : mean()
합계 : sum()
null 값 제외한 유효데이터 개수 : count()
고유값 배열 : unique()

ex)

6. 데이터 선택

> 컬럼 선택 : df[['키','이름']]

> 정수를 통한 인덱싱
df  [  df.columns[0]  ]      # df['이름']과 동일한 동작
df  [  df.columns[-1]  ]     # 맨 우측 맨 끝에 있는 값을 가져옴


>슬라이싱(행에 대해서 적용) : 하나의 열에서 몇가지 행만 끊어서 가져옴
df [ '영어' ] [ 0 : 5 #0에서 4까지의 데이터를 가져옴
df [ [ '이름', '키' ] ] [ :3 #이름 / 키 열의 0-2행의 데이터


> 데이터 선택(loc) : 이름을 이용해서 원하는 row에서 원하는 col을 선택
df.loc [ '1번' #index 1번에 해당하는 전체 데이터
df.loc [ '1번' '국어' #index 1번에 해당하는 데이터 중 국어 데이터
df.loc[ '1번' : '5번' "국어" : "사회"

> 데이터 선택(iloc) : integer -> 정수 위치를 가지고 원하는 row에서 원하는 column

df.iloc[
0:5#0-4번째 인덱스까지 정보 슬라이스
#슬라이싱 ->정수의 경우에는 대괄호가 추가적으로 필요x
df.iloc[0:5,3:8]



7. 데이터 선택(조건)

조건에 해당하는 데이터 선택

#조건을 변수에 넣어줌 -> 그 조건 변수를 대괄호 안에 넣어주기
filt= (df['키'] >=185)
df[filt]
df[~filt] #여집합 구하기

# loc 활용 : 조건으로 행 필터링
df.loc [ filt ,  ['이름' , '수학' , '과학' ] ]  #키가 185 이상인 학생들의 이름,수학,과학 데이터

#다양한 조건
- & :그리고
- | : or

df.loc[(df['키']<170) | (df['키']>200)]

# str 함수
#소문자로 변환.str.lower()
#대문자로 변환.str.upper()
#.str. startswith() :~으로 시작하는 것
#.str. contains() :~가 포함되는 것
#.str. endswith() :~으로 시작하는 것

ex)
filt =df['이름'].str.startswith('송')
filt =df['이름'].str.contains('태')


#.isin(a) :a안에 있는지
langs= ['PYTHON', "Java"]
filt = df['SW특기'].isin(langs)   # Sw특기가 안에있는지

8. 결측치

비어있는 데이터

>데이터 채우기 : fillna
df.fillna('')          #결측치 데이터를 빈칸으로 채움
df.fillna('없음')   #결측치 데이터를 없음으로 채움


>일부 데이터에서만 채우기 -> series 고른 이후에 채움
df['SW특기'].fillna('확인 중', inplace=True)


>데이터 제외하기 : dropna
df.dropna(inplace=True)

#옵션
axis : index / columns   => null이 있는 행의 열을 지울지 / 행을 지울지 선택
how : any / all               => 하나라도 있으면 지우기 / 전체가 null이면 지우기

9. 데이터 정렬

#sort_values(기준)
df.sort_values('키')                                 #키 기준으로 오름차순 정렬
df.sort_values('키', ascending =False)   #키 기준으로 내림차순 정렬


#여러기준으로 order

#수학 점수 오름차순-> 영어 점수 기준 내림차순
df.sort_values(['수학''영어'], ascending =[True,False])


10. 데이터 수정

# replace({a:b}) =  a = > b

> 북산고를 키로 찾아서 상북고로 바꿈
df['학교'].replace({'북산고':'상북고'}, inplace=True)
 
>소/대문자로 바꾸기
df['SW특기'] = df['SW특기'].str.lower()
df['SW특기'] = df['SW특기'].str.upper()

>뒤에 값추가
df['학교'] = df['학교']+'등학교'

>추가

열 추가 :  열 이름 적고 값을 넣어줌
df['총합'] = df['국어'] +df['영어'] +df['수학'] +df['과학'] +df['사회']

행 추가 : index를 적고 각 값을 넣어주기
df.loc['9번']=['이정환','해남고등학교', 184, 90, 90, 90, 90,90, 'Kotlin', 450, 'Pass']

>삭제
열 삭제 : df.drop(columns=['총합'])
행 삭제 :
df.drop(index='4번')

>ceil 수정
-> loc으로 셀 지정 후 범위에 들어갈 값 넣기

ex) 
df.loc['4번','SW특기'] ='Python'                                # 4번 학생의 sw특기를 python으로 변경시킴
df.loc['5번',['학교','SW특기']] =['능남고등학교','C']   # 5번 학생의 학교와 sw특기 변경


>열 순서 변경

맨 뒤에 있는 결과 column을 앞으로 가져오고 나머지 column들과 합쳐서 순서 변경
df=df[[cols[-1]]+cols[:-1]]

>열 이름 변경 -> columns에 각각 값 대입
df.columns=['Result','Name','School']

11. 함수 적용

ex1) sw 특기를 첫글자는 대문자/나머지는 소문자로 만드는 함수 적용


ex2) 키 뒤에 cm를 붙이는 함수

12. 그룹화

동일한 값을 가진 것들기리 합쳐서 통계 or 평균

>그룹화 : df.groupby(기준열)

>그룹화 된 값 중 하나 추출
: df.groupby(기준열).get_group(값)

df.groupby('학교').get_group('북산고') 

>그룹 크기정보 : df.groupby(기준열).size()

>특정 값의 크기정보
: df.groupby(기준열).size()['값']

df.groupby('학교').size()['능남고']


>값이 몇개 있는지 : value_counts()