본문 바로가기
PYTHON/빅데이터분석기사

Pandas-01 (youtube s2-02~09)

by 쿠룽지 2023. 11. 4.
728x90
반응형
728x90

 

 

1. 파일 읽어오기

#csv 파일 (띄어쓰기가 구분자)
df = pd.read_csv('url',sep='\t')

#excel 파일
df = pd.read_excel('file',engine='openpyxl')

 

 

2. 데이터 구조 확인

#df의 row 개수 및 각 column의 정보 (info()에서 메모리 사용량도 확인 가능)
df.info()
df.info(memory_usage='deep')

#df의 행, 열의 수 확인
df.shape()

#df의 index 구성요소 확인
df.index #RangeIndex(start=0, stop=1000, step=1) 이런 식으로 출력됨

#df의 columns 구성요소 확인
df.columns #index
df.columns.values #array

#df의 values 구성요소 확인
df.values



# [1-11] 컬럼의 이름을 ['채널', '카테고리', '구독자', '조회', '영상']으로 변경합니다.
# 변경 후 상위 2개 행을 출력해 봅니다.
df.columns = ['채널', '카테고리', '구독자', '조회', '영상']
df.head(2)

 

 

3. 데이터 타입 변경

#astype을 이용하여 변경
#타입 표시 방법: int, int32, int64, float, str, category 등
#문자열로 지정할 수도 있지만 np.int16, np.float32, np.datetime64처럼 numpy 타입으로도 지정가능 (import numpy as np 실행 후)

#5120만 처럼 한글이 섞여있는 df의 타입을 변경해보자
df['subscriber'].astype('int64') #한글,특수문자 등이 섞여 있으면 정수로 변경할 수 없음

#어디에서 문제가 일어났는지 확인
pd.to_numeric(df['subscriber'])

#한글 변환하기 (만 -> 0000으로 변경)
df['subscriber'].replace('만','0000',regex=True)

#변경할 내용이 여러 개일 경우, list or dict를 사용 (if 메타문자일 경우 \ 사용)
df['view'].replace(['억','만],['','0000'],regex=True)
df['view'].replace({'억':'','만':'0000'},regex=True)

 

 

 

4. 데이터의 값 별 개수 확인

#df의 열 중 'category' 컬럼에 대해 값 별 개수를 확인
df['category'].value_counts()

#category의 dtype을 int64 -> category로 변경 시 [자동차] 처럼 특수문자가 양옆으로 포함되어 있어 제거해야 할 경우
#replace 사용
temp = df['category'].replace({'\[':'', '\]':''}, regex=True)
#str 사용
df['category'].str[1:-1].astype('category')

#가공 파일 엑셀로 저장
df.to_excel('파일명', index=False)

 

 

 

5. datetime, category 타입 변경

#pd.to_datetime(Series, format='형식')
	#format 지정이 필수는 아님
#pd.Categorical(Series, categories=['범주1','범주2'], ordered=None)
	#ordered=True 사용 시 순서 있는 범주형, 정렬 시 정해진 순서가 사용됨 (필수 아님)
    
#날짜_일반의 dtype을 object -> np.datetime64 로 변경
s1 = temp['날짜_일반'].astype(np.datetime64)

#위 방법대로 날짜_특수도 np_datetime64로 변경하려 했으나 21-01-01 이라는 특수한 형태 때문에 변형됨
#그렇기 때문에 pd.to_datetime() 사용
s2 = pd.to_datetime(temp['날짜_특수'], format='%y-%m-%d')

#------------------------------------------------------------------------

#범주의 dtype object -> category로 변경
s3 = temp['범주'].astype('category')

#위에서 만들어진 범주 sort_values로 정렬 시 (월화수목금토일) 정상적으로 정렬되지 않음
#pd.Categorical 사용해보기
#pd.Categorical(Series, categories=카테고리 목록, ordered=True)를 사용
s4 = pd.Categorical(temp['범주'], categories=['월','화','수','목','금','토','일'], ordered=True)

#위에서 만들어진 범주 적용해서 재정렬
temp['범주'] = s4
temp['범주'].sort_values

 

 

 

 

 

인기 채널 확인하기

1) 데이터 정렬하기

#subscriber가 가장 많은 5개의 채널을 알아봅니다.
df.sort_values('subscriber', ascending=False).head()

#view가 가장 많은 5개의 채널을 알아봅니다.
df.sort_values('view', ascending=False).head()

#'video'가 가장 많은 5개 채널을 알아봅니다
df.sort_values('video',ascending=False).head()

#'video'가 가장 적은 5개 채널을 알아봅니다
df.sort_values('video').head() #기본값이 True

#category로 오름차순, subscriber로 내림차순 정렬해봅시다
df.sort_values(['category', 'subscriber'], ascending=[True, False])

 

 

2) Boolean indexing 사용하여 조건에 맞는 데이터 가져오기

  • DateFrame.loc[조건,:]
  • DateFrame[조건]
  • 조건은 boolean dtype이어야 하며 행의 수와 같아야 함
  • | & ~
#'category'가 '음악/댄스/가수'인 채널의 subscriber TOP5를 알아봅니다.
df[df['category']=='음악/댄스/가수']sort_values('subscriber', ascending=False).head()

#'category'가 'TV/방송'인 채널의 view TOP5를 알아봅니다.
df.loc[df['category']=='TV/방송',:].sort_values('view', ascending=False).head()

#'subscriber'가 30000000 (3천만) 이상인 채널을 알아봅니다.
df[df['subscriber']>=30000000]

#'video' 개수가 30000 이상 35000 이하인 채널을 알아봅니다.
df[(df['video'] >= 30000) & (df['video'] <= 35000)]

# 'subscriber'가 30000000 (3천만)이상 이거나, 'video' 개수가 50000 이상인 채널을 알아봅니다.
df.loc[(df['subscriber']>=30000000) | (df['video']>=50000),:]

#'category'의 값 별 개수를 확인합니다.
df['category'].value_counts()

#'category'가 'TV/방송' 이거나 '게임'인 채널의 개수를 확인합니다.  (262개)
temp = df[(df['category']=='TV/방송') | (df['category']=='게임')]
print(len(temp))

#isin 이용해서 개수 세기
temp = df[df['category'].isin(['TV/방송','게임'])]
print(len(temp))

#'category'가 '음악/댄스/가수'인 채널의 subscriber TOP5를 알아봅니다. (isin 활용)
df[df['category'].isin(['음악/댄스/가수'])].sort_values('subscriber', ascending=False).head()
#isin 결과가 bool 형식으로 출력되기 때문에 반드시 df로 감싸야함

 

 

 

3) Series 의 str Accessor 

  • str.contains('문자열'): 특정 문자열을 포함하는지 아닌지를 T/F로 반환
  • str.upper()
  • str.lower()
  • Series.to_list() : values를 list로 반환
  • Series.to_numpy() : values를 ndarray로 반환 (=Series.values와 동일)
#title에 'KBS'가 포함된 채널 명 목록을 만들어 봅니다.
df[df['title'].str.contains('KBS')]
df[df['title'].str.contains('KBS')]['title'].to_numpy() # title만 array형태로 출력

#df.loc로도 가능
df.loc[df['title'].str.contains('KBS'), 'title'].to_numpy()

#대소문자 구분없이 검색하려면?
df.loc[df['title'].str.upper().str.contains('KBS'),'title'].to_numpy()
df.loc[df['title'].str.lower().str.contains('kbs'),'title'].to_numpy()

 

 

 

4) 통계값 알아보기

  • df.describe() : 적용가능 컬럼에 대해 count, mean, std, min, max, Q1, Q2, Q3 등의 통계값 구하기
  • Series.count() : 개수
  • Series.sum() : 합계
  • Series.mean() : 평균
  • Series.std() : 표준편차
  • Series.var() : 분산
  • Series.median() : 중앙값
  • Series.mode() : 최빈값
  • Series.quantile([0.25, 05, 0.75]) : 분위수
#subscriber, view, video에 대한 통계값을 알아봅니다. (describe 사용)
df.describe()

#'video' 컬럼의 데이터 개수를 구합니다
df['video'].count()

#'video' 컬럼의 합계를 구합니다.
df['video'].sum()

#'video' 컬럼의 평균, 중앙값을 구합니다.
df['video'].mean(), df['video'].median()

#'video'의 분산과 표준편차를 구합니다.
 df['video'].var(), df['video'].std()
 
#'subscriber'의 최대, 최소값을 구합니다.
df['subscriber'].max(), df['subscriber'].min()

#'subscriber'의 최빈값을 구합니다.
df['subscriber'].mode() # 근데 이렇게만 내놓으면 series값이 출력됨
df['subscriber'].mode()[0]

#'subscriber'의 Q1, Q2, Q3(25%, 50%, 75%), IQR 를 구합니다.
Q1,Q2,Q3 = df['subscriber'].quantile([0.25,0.5,0.75])
print(Q1,Q2,Q3,Q3-Q1)

 

 

5) 그룹별 통계치 구하기

  • df.groupby(그룹명).통계함수()
  • df.groupby(그룹명)[컬럼].통계함수() : Series
  • df.groupby(그룹명)[컬럼1, 컬럼2].통계함수() : Df
#category 별 평균을 구할 수 있는 모든 컬럼에 대한 평균을 구합니다.
df.groupby('category').mean()

#category 별 view에 대한 평균을 구합니다.
df.groupby('category')['view'].mean() # Series
df.groupby('category')[['view']].mean() # Df

#category 별 view, video에 대한 합계를 구합니다.
df.groupby('category')[['view','video']].sum()
728x90
반응형