Jam's story

Pandas 3주차 본문

2021-2학기/데이터분석

Pandas 3주차

애플쩀 2022. 3. 23. 12:12

3째주 공부내용:

Pandas 기본사용법 + CCTV데이터 이용하여 구현해보기 (초반까지 밖에 못함 ) +pandas 복습

 

판다스(pandas) 기본 사용법 익히기 (dandyrilla.github.io)

이거 참고하면서 공부했습니다.

import pandas as pd

dates=pd.data_range('20130101', period=6)

데이터 프레임 만들기 - > pd.DataFrame( index= , columns=)

index는 행 (세로 )

columns는 열 (가로)

df=pd.DataFrame(np.random_randn(6,4), index=dates, columns=list('ABCD')

DataFrame은 딕셔너리를 이용할 수있다.

df2 = pd.DataFrame({'A': 1., 'B': pd.Timestamp('20130102'), 'C': pd.Series(1, index=list(range(4)), dtype='float32'), 'D': np.array([3]*4, dtype='int32'), 'E': pd.Categorical(['test', 'train', 'test', 'train']), 'F': 'foo'}) # A B C D E F # 0 1.0 2013-01-02 1.0 3 test foo # 1 1.0 2013-01-02 1.0 3 train foo # 2 1.0 2013-01-02 1.0 3 test foo # 3 1.0 2013-01-02 1.0 3 train foo

데이터 프레임의 속성확인하기 - > dtypes

주피터로는 df2. +<TAB> 누르면 dtypes 이외에 다른 속성들도 같이 출력됨

df2.dtypes # A float64 # B datetime64[ns] # C float32 # D int32 # E category # F object # dtype: object In [13]: df2.<TAB> df2.A df2.bool df2.abs df2.boxplot df2.add df2.C df2.add_prefix df2.clip df2.add_suffix df2.clip_lower df2.align df2.clip_upper df2.all df2.columns df2.any df2.combine df2.append df2.combine_first df2.apply df2.compound df2.applymap df2.consolidate df2.as_blocks df2.convert_objects df2.asfreq df2.copy df2.as_matrix df2.corr df2.astype df2.corrwith df2.at df2.count df2.at_time df2.cov df2.axes df2.cummax df2.B df2.cummin df2.between_time df2.cumprod df2.bfill df2.cumsum df2.blocks df2.D

데이터 확인하기

맨앞을 확인하기 -> df.head()

마지막을 확인하기 -> df.tail()

인덱스(행)을 확인하기 -> df.index

칼럼(가로)를 확인하기 -> df.columns

안에있는 numpy데이터를 확인하기 ->df.values

.describe()

생성했던 DataFrame 의 간단한 통계 정보를 보여줍니다. 컬럼별로 데이터의 개수(count), 데이터의 평균값(mean), 표준 편차(std), 최솟값(min), 4분위수(25%, 50%, 75%), 그리고 최댓값(max)들의 정보를 알 수 있습니다.

.T

열과 행을 바꾼다.

DataFrame 에서 index 와 column 을 바꾼 형태의 DataFrame 입니다.

.t()로 하면 에러 , 소문자로 해도 에러

.sort_index()

행과 열 이름을 정렬

axis=0 인덱스 기준 ( 기본값)

axis= 1 칼럼 기준

ascending=True는 오름차순,

ascending=False는 내림차순

df.sort_index(axis=0, ascending=True)

.sort_values(by = ' ' )

B 칼럼에 대해 정렬한 결과

df2.sort_values(by='')

df['A'] = df.A

df[0:3] ## 맨처음 3행 인덱스 0,1,2 가져옴 df['20130102':'20130104'] ##인덱스 해당하는 값 가져옴

.loc

이름을 이용하여 선택하기 , 라벨의 이름을 이용하여 선택 가능

df.loc[dates[0]] df.loc['20130101'] df.loc['2013-01-01'] df.loc[:,['A','B']] ##칼럼 a랑 b에 대한 모든값 df.loc['20130102':'20130104',['A','B']] ##인덱스 ‘2013-01-02’부터 ‘2013-01-04’까지의 컬럼 ‘A’와 컬럼 ‘B’의 값 가져오기. df.loc[dates[0], ['A','B']] df.loc[dates[0],'A']

.iloc[ ]=.iat[ ]

인덱스 번호를 이용하여 데이터를 선택하기

df.iloc[3:5,0:2] ##인덱스가 3~4 && 칼럼 인덱스가 0~1

df.iloc[[1,2,4],[0,2]] ##인덱스가 1,2,4 && 칼럼인덱스가 0~1

##범위가 아닌 인덱스 숫자로 결정할때는 대괄호를 이용함

df.iloc[3] ##3행이 출력된다. df.iloc[3:5,0:2] ##인덱스가 3~4 && 칼럼 인덱스가 0~1 df.iloc[[1,2,4],[0,2]] ##인덱스가 1,2,4 && 칼럼인덱스가 0~1 ##범위가 아닌 인덱스 숫자로 결정할때는 대괄호를 이용함 df.iloc[1:3,:] ##인덱스 1~2 && 칼럼 전체 df.iloc[:,1:3] ##인덱스 전체 && 칼럼 1~2 ##값 하나 선택 df.iloc[1,1] df.iat[1,1]

.isin()

조건을 설정하여 데이터 선택

E에서 값이 two, three 인것

df2['E']=['one','two', 'three', 'four'] df2[df2['E'].isin(['two', 'three'])]

데이터 특정 값 바꾸기

at[행, 열 ] == iat[행,열]

df.at[dates[0], 'A'] = 0 df.iat[0,1] = 0

결측치

-비어있는 값은 Nan으로 채워짐

reindex

인덱스 변경/추가/삭제 , 복사된 데이터프레임을 반환

df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])

df1.loc[dates[0]:dates[1], 'E'] = 1

dropna()

결측치가 하나라도 존재하는 행들을 버리고 싶을 때

fillna()

만약 결측치가 있는 부분을 다른 값으로

df1.fillna(values=5) # A B C D F E # 2013-01-01 0.000000 0.000000 -1.509059 5 5.0 1.0 # 2013-01-02 1.212112 -0.173215 0.119209 5 1.0 1.0 # 2013-01-03 -0.861849 -2.104569 -0.494929 5 2.0 5.0 # 2013-01-04 0.721555 -0.706771 -1.039575 5 3.0 5.0

.isna()

결측치인지 아닌지 여부 판단

pd.isna(데이터프레임 이름 )

통계적 지표들

mean()

평균 구하기, 일반적으로 결측치는 제외하고 연산을 한다

mean(1)

인자로 1을 주게 면 컬럼이 아닌 인덱스 기준

결측치 계산

뭔소리인지 모르겟.

함수 적용하기

apply()

기존에 있던 함수를 넣어도 되고,

사용자 지정함수 lambda를 이용해도 된다.

df.apply(np.cumsum) # A B C D F # 2013-01-01 0.000000 0.000000 -1.509059 5 NaN # 2013-01-02 1.212112 -0.173215 -1.389850 10 1.0 # 2013-01-03 0.350263 -2.277784 -1.884779 15 3.0 # 2013-01-04 1.071818 -2.984555 -2.924354 20 6.0 # 2013-01-05 0.646846 -2.417535 -2.648122 25 10.0 # 2013-01-06 -0.026844 -2.303886 -4.126549 30 15.0 df.apply(lambda x: x.max() - x.min()) # A 2.073961 # B 2.671590 # C 1.785291 # D 0.000000 # F 4.000000 # dtype: float64

히스토그램

 

values_counts()

데이터의 빈도 조사

s = pd.Series(np.random.randint(0, 7, size=10)) # 0 4 # 1 2 # 2 1 # 3 2 # 4 6 # 5 4 # 6 4 # 7 6 # 8 4 # 9 4 # dtype: int64 s.value_counts() # 4 5 # 6 2 # 2 2 # 1 1 # dtype: int64
s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat']) s.str.lower() # 0 a # 1 b # 2 c # 3 aaba # 4 baca # 5 NaN # 6 caba # 7 dog # 8 cat # dtype: object

합치기

concat

자료들을 이어 하나로 만들어줌

append

데이터 프레임에 하나의 행 추가

merge ()

데이터베이스 합치기

left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]}) # key lval # 0 foo 1 # 1 foo 2 right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]}) # key rval # 0 foo 4 # 1 foo 5 merged = pd.merge(left, right, on='key') # key lval rval # 0 foo 1 4 # 1 foo 1 5 # 2 foo 2 4 # 3 foo 2 5 left = pd.DataFrame({'key': ['foo', 'bar'], 'lval': [1, 2]}) # key lval # 0 foo 1 # 1 bar 2 right = pd.DataFrame({'key': ['foo', 'bar'], 'rval': [4, 5]}) # key rval # 0 foo 4 # 1 bar 5 merged = pd.merge(left, right, on='key') # key lval rval # 0 foo 1 4 # 1 bar 2 5

append()

데이터프레임의 맨 뒤에 행을 추가한다.

아래의 예제는 4번쨰 행을 기존 데이터 프레임의 맨 뒤에 한번 더 추가하는 방법을 보여줌

피벗테이블

df = pd.DataFrame({'A': ['one', 'one', 'two', 'three'] * 3, 'B': ['A', 'B', 'C'] * 4, 'C': ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 2, 'D': np.random.randn(12), 'E': np.random.randn(12)}) df # A B C D E # 0 one A foo 1.418757 -0.179666 # 1 one B foo -1.879024 1.291836 # 2 two C foo 0.536826 -0.009614 # 3 three A bar 1.006160 0.392149 # 4 one B bar -0.029716 0.264599 # 5 one C bar -1.146178 -0.057409 # 6 two A foo 0.100900 -1.425638 # 7 three B foo -1.035018 1.024098 # 8 one C foo 0.314665 -0.106062 # 9 one A bar -0.773723 1.824375 # 10 two B bar -1.170653 0.595974 # 11 three C bar 0.648740 1.167115
pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C']) # C bar foo # A B # one A -0.773723 1.418757 # B -0.029716 -1.879024 # C -1.146178 0.314665 # three A 1.006160 NaN # B NaN -1.035018 # C 0.648740 NaN # two A NaN 0.100900 # B -1.170653 NaN # C NaN 0.536826

시계열 데이터 다루기

1초마다 측정된 데이터를 5분마다 측정된 데이터의 형태로 바꾸고 싶을떄

rng = pd.date_range('1/1/2012', periods=100, freq='S') ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng) ts.resample('5Min').sum() # 2012-01-01 25083 # Freq: 5T, dtype: int64
rng = pd.date_range('3/6/2012 00:00', periods=5, freq='D') ts = pd.Series(np.random.randn(len(rng)), rng) ts # 2012-03-06 0.464000 # 2012-03-07 0.227371 # 2012-03-08 -0.496922 # 2012-03-09 0.306389 # 2012-03-10 -2.290613 # Freq: D, dtype: float64 ts_utc = ts.tz_localize('UTC') ts_utc # 2012-03-06 00:00:00+00:00 0.464000 # 2012-03-07 00:00:00+00:00 0.227371 # 2012-03-08 00:00:00+00:00 -0.496922 # 2012-03-09 00:00:00+00:00 0.306389 # 2012-03-10 00:00:00+00:00 -2.290613 # Freq: D, dtype: float64 ts_utc.tz_convert('US/Eastern') # 2012-03-05 19:00:00-05:00 0.464000 # 2012-03-06 19:00:00-05:00 0.227371 # 2012-03-07 19:00:00-05:00 -0.496922 # 2012-03-08 19:00:00-05:00 0.306389 # 2012-03-09 19:00:00-05:00 -2.290613 # Freq: D, dtype: float64

범주형 데이터 다루기

plot

ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000)) ts = ts.cumsum() ts.plot()
df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=['A', 'B', 'C', 'D']) df = df.cumsum() plt.figure(); df.plot(); plt.legend(loc='best')

구별 CCTV 현황 +인구현황

1장 서울시 구별 CCTV 현황 분석 (tistory.com) 를 참고하며 공부하였습니다.

import pandas as pd CCTV_Seoul=pd.read_csv('C:/Users/kimjm/Downloads/CCTV_in_Seoul.csv',encoding='utf-8') CCTV_Seoul.head()

pandas에서 CSV 파일을 읽는 명령은 read_csv입니다.

그안에 한글을 사용하는 경우는 인코딩에 신경 써야 합니다.

CCTV 데이터는 UTF-8로 인코딩되어 있어서 read_csv 명령을 쓸 때 incoding 옵션에 UTF-8이라고 저장해야 합니다.

파일명지정= pd.read_csv('파일명' , encoding='utf-8')

이때 사용된 head() 명령은 pandas 데이터의 첫 5행만 보여달라는 것입니다.

. 데이터 뒤에 columns라고 하면 column의 이름들이 반환됩니다.

기관명 - >구별로 바꾸기

rename을 이용한다

rename(columns={CCTV_Seoul.columns[0]:'구별 ' }, replace=True)

CCTV_Seoul.columns[0] = '구별 ' 을 이용해 구별로 바꾸고

replace=True는 실제 CCTV_Seoul이라는 변수의 내용을 갱신하라는 의미 입니다.

존재하지 않는 이미지입니다.

CCTV 전체 개수인 소계로 정렬, 오름차순 (ascending=True)

CCTV의 전체 개수가 가장 작은 구는 '도봉구','마포구','송파구','중랑구','중구'라는 것을 알 수 있다

존재하지 않는 이미지입니다.
존재하지 않는 이미지입니다.

CCTV 최근 증가율

2016년 +2015년 +2014년을 더해 2013년 이전의 것으로 나눈후 * 100

최근증가율을 구한뒤 내림차순으로

CCTV 최근 증가율이 높은대로 정렬

그 결과를 보면 최근 3년간 CCTV가 그 이전 대비 많이 증가한 구는

'종로구','도봉구','마포구','노원구','강동구'라는 것도 알 수 있다.

CCTV_Seoul['최근증가율'] = (CCTV_Seoul['2016년'] + CCTV_Seoul['2015년'] + \ CCTV_Seoul['2014년']) / CCTV_Seoul['2013년도 이전'] * 100 CCTV_Seoul.sort_values(by='최근증가율', ascending=False).head(5)
존재하지 않는 이미지입니다.

엑셀파일 불러오기

pd.read_excel('파일명.xsl')

여기서 오류가 났었는데, 파일명 앞에 r을 붙이라는 조언이 많았음

붙여도 안되어서 오류난 것을 검색하여, 블로그에 나와있는대로

xlrd 랑 openpyxl을 설치하니 바로 되었음

존재하지 않는 이미지입니다.

인덱스 0,1 줄이 이상함 그래서 중간에 header=2(인덱스 2부터 =3번쨰줄)추가해줌

존재하지 않는 이미지입니다.

칼럼의 이름 바꾸기= rename

 

존재하지 않는 이미지입니다.

CCTV_Seoul이라는 변수에는 '구별 CCTV 현황'을, pop_Seoul이라는 변수에는 '구별 인구 현황'을 저장

[Pandas 복습 ]

pandas의 데이터 유형 중 기초가 되는 것이 Series입니다.

대괄호로 만드는 파이썬의 list 데이터로 만들 수 있습니다.

중간에 NaN(Not A Number)도 넣었습니다.

존재하지 않는 이미지입니다.

6행 4열의 랜덤수들을 만든다. ->np.random.randn(6,4)

df=pd.DataFrame(np.random.randn(6,4),index=dates,columns=['A','B','C','D'])

데이터잘라서 보기

index 하고 () 이 괄호를 쓰는게 아니라 딱 index,

범위를 지정하고 싶으면 [a:b] 대괄호 사용

존재하지 않는 이미지입니다.

info() 명령을 사용하면 데이터 프레임의 개요를 알수있다.

존재하지 않는 이미지입니다.

df.describe()

describe 명령어는 통계적 개요를 확인 할 수 있습니다.

개수와 평균 뿐만 안니라 min,max와 각 1/4 지점,표준편차까지 한번에 알 수 있습니다.

존재하지 않는 이미지입니다.

by로 지정하여 ,내림차순으로

ascending =True, (오름차순)

ascending =False (내림차순)

존재하지 않는 이미지입니다.

df변수에서 좀 더 통계 느낌의 데이터를 볼 때는 특정 함수를 적용시키면 좋습니다.

이때 사용하는 것이 apply 명렁입니다.

누적합을 알고 싶을 때는 numpy의 cumsum을 이용하면 됩니다.

존재하지 않는 이미지입니다.

다음주까지 공부 할 것 :

pandas 복습+ CCTV 현황,인구현황 이어서

 

'2021-2학기 > 데이터분석' 카테고리의 다른 글

크롤링  (0) 2022.03.23
영화리뷰 감정분석  (0) 2022.03.23
서울종합병원분포 알아보기  (0) 2022.03.23
목차 칼럼명 뽑기  (0) 2022.03.23
딕셔너리, 아이템  (0) 2022.03.23
Comments