[비전공자 코딩공부 6월 24일 24일차] Pandas(2) (2024)

PRE

[비전공자 코딩공부 6월 24일 24일차] Pandas(2)

엘리 2021. 6. 24. 21:20

URL 복사 이웃추가

본문 기타 기능

신고하기

안녕하세요 엘리입니다.

오늘은 pandas 두번째 시간입니다!!

Pandas 파일 입출력

Pandas를 이용하여 외부 csv파일을 data frame으로 읽어오거나 csv파일로 내보낼 수 있습니다.

data_studentlist_en.csv자료에서 grade와 absence자료만 불러와 data_mine이라는 csv파일을 생성할 수 있습니다.

data_studentlist_en.csv아래 data_mine이라는 파일이 생성된 것을 확인할 수 있습니다.

index를 False로 설정하면 위와 같이 인덱스가 없이 출력되는 것을 알 수 있습니다.

index를 True로 지정하면 위와 같이 index number가 붙은 것을 확인할 수 있습니다.

pd.read_csv를 통해 생성한 csv파일을 불러올 수도 있습니다.

csv뿐만 아니라 엑셀파일을 생성할 수 있습니다.

xlsx로 파일이 생성된 것을 알 수 있습니다.

파일을 열어보면 엑셀파일로 자료가 들어간 것을 볼 수 있습니다.

위에서 csv파일을 불러 온 것처럼 pd.read_excel를 이용하면 엑셀파일도 불러올 수 있습니다.

json의 형태로도 생성할 수 있습니다.

df4.to_json를 하면 data_mine의 json파일이 생성됩니다.

json파일은 이와 같이 생성이 되는데 csv에 비해 가독성이 떨어집니다.

pd.read_json을 하면 json파일을 불러올 수도 있습니다.

table의 형태로 csv파일을 읽어올 수 있습니다. table은 csv보다 범용적으로 사용되는 정보입니다.

delimiter를 설정하지 않으면 위와 같이 가독성이 떨어지는 것을 알 수 있습니다.

delimiter=","를 설정해줘야지만 위와 같이 깔끔한 형태의 표로 데이터를 불러올 수 있습니다.

Pandas DataFrame 연산

dictionary를 이용하여 DataFrame을 제작합니다.

제작된 DataFrame에 수를 곱하거나 더해도 각각의 값에 더한 값이 출력됩니다.

또 다른 DataFrame을 제작해서 DataFrame끼리 연산시켜봅니다.

DataFrame끼리 연산을 하면 위와 같이 각각의 값을 사칙연산한 값이 출력됩니다.

다만 주의할 것이 shape, column의 값, index의 값이 일치해야 오류없이 사칙연산이 됩니다.

예를 들어 df2의 col0 값을 col3으로 이름을 바꿔서 df1+df2를 진행했을 때 일치하는 값인 col1과 col2는 연산이 잘 되는 걸 확인할 수 있으나 col0과 col3은 일치하는 값이 없으므로 결측치가 출력되는 것을 알 수 있습니다.

또한 index의 값을 변경했을 때도 동일합니다.

df2의 index를 기본값인 0 1 2 3이 아니라 a b c d로 재설정한 후 DataFrame의 연산을 진행합니다.

index가 일치하지 않기 때문에 결측치 값이 뜨고 연산이 이루어지지 않은 것을 알 수 있습니다.

DataFrame 통계연산

DataFrame의 통계연산을 위해 irls 자료를 불러옵니다(irls data는 매우 유명한 data)

df.info()를 하면 df의 data Frame의 구조를 보여줍니다.

Non-Null값은 결측치가 없다는 것을 의미합니다.

column의 명에 콤마나 Space가 들어가게 되면 df.(column명)을 했을 때 불러와 지지가 않습니다.

그래서 column의 명에 콤마나 Space를 넣는 것을 지양하고 _를 넣어 df.(column명)을 했을 때 쉽게 불러올 수 있게 합니다.

위의 방식으로 인식이 되지 않을 때는 df[column명]을 이용해 데이터를 불러올 수 있습니다.

numpy나 series에서 했던 통계적 연산을 DataFrame에서도 적용할 수 있습니다.

df.sum()을 하게되면 문자열의 집합인 Species까지 합계되므로 drop을 이용해 원하는 column을 삭제할 수 있습니다.

다만 항구적으로 삭제하는 것은 아니므로 다음에 데이터를 불러올 때 나타나는 것을 확인할 수 있습니다.

df.count()는 결측치가 아닌 정상값들을 카운트해줍니다.

df.mean()은 평균값을 나타냅니다. axis=0은 열 axis=1은 행이므로 부수적으로 설정해 놓으면 원하는 값을 알맞게 추출할 수 있습니다.

df.median()은 중앙값을 나타냅니다.

df.std()은 표준편차를 나타냅니다.

df.max()은 최댓값, df.min()은 최솟값을 나타냅니다.

원하는 값을 각각 입력해서 출력할 수도 있지만 df.describe()을 이용하면 통계정보가 데이터프레임의 형태로 정리되서 출력됩니다.

25% 1사분위수, 50% 중위수 or 2사분위수, 75% 3분위수를 나타내는 값입니다.

corr을 이용하면 상관계수의 값을 출력할 수 있습니다.

특정열을 지정하여 상관계수의 값을 구할 수도 있습니다.

df[행1].corr[행2]를 하면 각 변수 간의 상관관계를 비교할 때 유용하게 이용됩니다.

(상관계수의 값이 1또는 -1에 가까울 수록 두 변수 사이의 연관성이 크고 0에 가까울 수록 매우 약함을 의미합니다.)

열의 순서를 바꿔도 같은 값이 출력됩니다.

df.corrwith는 다른 시리즈나 데이터프레임과의 상관관계를 계산하는데 유용합니다.

df[조건]을 설정하여 원하는 값의 통계수치를 적용하여 값을 출력할 수도 있습니다.

조건을 중복으로 설정하여 값을 출력하는 것도 가능합니다.

원하는 값의 자료를 카운팅 하여

dict로 묶어서 반환하는 것도 가능합니다.

Pandas 결측치

위의 자료에는 결측치가 없다는 것을 확인할 수 있습니다.

결측치에 숫자를 더하거나 곱해도 아무런 값이 출력되지 않습니다.

결측치를 입력하는 방법은 df.iloc[행,열]에 원하는 행과 열값을 올려서 np.nan을 넣어주면 결측치가 생겼다는 걸 알 수 있습니다.

위에 data Frame의 구조와 비교해보면 non-null의 개수가 줄어든 걸 알 수 있습니다.

skipna를 이용하면 결측치 값을 생략하고 정상치만을 계산할지 결측치가 있는 값은 아에 계산을 하지 않을지에 관한 것을 설정할 수 있습니다.

skipna=True로 지정하면 정상치만을 합할 수 있고 skipna=False로 지정하면 결측치가 있는 column은 NaN값으로 출력합니다

mean으로는 결측치의 비율을 확인할 수 있는데 skipna에서 False값을 설정하면 결측치가 있는 column에는 NaN값이 출력됩니다.

df.Species.value_counts()는 도수표를 제작해주는 함수입니다.

dropna=fales를 적용하면 NaN값도 count해준다는 의미입니다.

df.isnull()함수는 결측치 여부를 알려주는 함수입니다.

결측치 값에는 True로 표현되고 결측치가 아닌 값에는 False로 표현됩니다.

(df.isnull()).sum(axis=0)를 하면 열별 결측치 값을 측정할 수 있습니다.

(df.isnull()).sum(axis=0)의 값은 len(df) 전체 행 값에서 df.count(axis=0) 즉 결측치가 아닌 값들을 빼면 동일한 값이 추출됩니다.

notnull은 결측치가 아닌 값들의 합계를 의미합니다. df.count()랑 동일한 값을 추출합니다.

df.dropna(axis=0)를 하면 결측치가 있는 행값을 제거한다는 의미입니다.

처음 shape은 150 X 5 의 형태였다면 현재는 결측치 값이 포함되어 있는 7개의 행이 제거되서 shape이 143X5가 된 걸 알 수 있습니다.

df2의 결측치를 항구적으로 제거하고 싶다면 inplace=True를 해야지만 항구적으로 제거가 됩니다.

df.dropna(axis=0, thresh = 3)을 설정하면 결측치가 3개 이상을 포함하고 있는 행만 제거하라는 의미입니다.

현재 결측치를 가지고 있는 행이 3개 이상이 아니기 때문에 shape이 변하지 않았다는 것을 알 수 있습니다.

df.dropna(axis=1)를 하면 결측치가 있는 열을 제거한다는 의미입니다.

column의 개수가 5개에서 2개로 줄었다는 것을 확인할 수 있습니다.

위에 행에서 적용했던 방법을 동일하게 열을 제거할 때도 사용할 수 있습니다.

df.dropna(axis=1, thresh = 148) thresh 148의 의미는 결측치가 148개 이상인 열만을 제거한다는 의미입니다.

열이 5에서 3으로 줄어든 것을 확인할 수 있습니다.

df.dropna(subset=['Sepal.Length'],how='any',axis=0)의 의미는 subset=[열의 값] 지정한 열의 값에 결측치가 하나라도 있으면 (how='any') 행의 값이 소개된다는 의미입니다.

150개의 행에서 149개로 행의 수가 줄어들었다는 것을 알 수 있습니다.

df.fillna(value=0)을 하면 결측치를 value로 지정한 값으로 채워 넣는다는 의미입니다.

df5를 count를 해보면 모두 정상값을 출력된 것을 알 수 있습니다.

df['Sepal.Length'].fillna(value=df['Sepal.Length'].mean())의 의미는 df['Sepal.Length'].mean()의 평균값으로 df['Sepal.Length']에 결측치를 넣겠다는 의미입니다.

결측치 값을 평균값으로 채워 넣었기 때문에 length함수의 갯수가 모두 정상값으로 반영된 것을 확인할 수 있습니다.

Python 중복

데이터 프레임에서 중복을 확인할 수 있습니다.

df.duplicated('c0')을 하면 c0열에서 중복값을 확인할 수 있습니다. 첫번째 값은 0이므로 false 첫번째 값과 두 번째 값이 중복되므로 True 두번째 값과 세번째 값이 중복되므로 True 세번째 값과 네번째 값이 중복되지 않으므로 False를 출력합니다.

중복된 행을 제거할 수도 있습니다. df.drop_duplicates()에 중복을 제거하고자 하는 열을 입력하면 중복이 있는 값을 제거하고 남은 값만 반환합니다. 첫번째 두번째 세번째 값이 0으로 중복이고 네번째 값이 1이므로 중복이 아닙니다. 그러므로 첫번째 값인 0과 네번째 값인 1만 남아서 출력된 것입니다.

keep을 활용하면 중복된 원하는 값을 제거할 수 있습니다.

keep="first"의 의미는 중복된 첫번째 값을 false로 인식하고 나머지는 True로 인식한다는 의미입니다.

0,1,2번 인덱스가 중복이므로 첫번째 값을 false 두세번째 값을 True로 인식합니다.

keep='last'의 의미는 중복된 마지막 값을 false로 인식하고 나머지는 True로 인식한다는 의미입니다.

0,1,2번 인덱스가 중복이므로 첫번째 두번째 값은 True 세번째 값은 False로 인식한다는 의미입니다.

keep=False는 모든 중복데이터를 True로 표기하거나 삭제합니다. 0,1,2번 인덱스가 중복이므로 모두 True값으로 표기합니다.

Pandas 시계열

금융데이터

판다스의 시계열 자료형은 Timestamp와 Period라는 두가지 타입이 있습니다.

Timestamp 자료형은 to_datetime()함수로 생성가능하며 날짜형태의 자료형을 시계열 타입으로 변환해줍니다.

Period자료형은 Timestamp(datetime)객체를 다시 기간에 따른 자료형으로 이용하고자 할때 사용합니다.

코로나 확진자 동선관련 정보를 불러옵니다.

header='infer'을 설정하는 이유는 첫행을 열 이름으로 쓸 것인지의 의미입니다.

데이터 요약정보를 확인하면 data는 object형식임을 알 수 있습니다.

to_datetime 함수를 이용해서 date를 timestamp 객체로 변환할 수 있습니다.

pd.to_datetime(df["date"])하면 dtype이 datetime64로 변경된 것을 알 수 있습니다.

Period객체는 to_period(freq="기간인수")를 통해 datetime변수에 대해 어떤 기간에 따른 자료형을 생성하고자 할 때 주로 활용됩니다. 아무 자료형에나 사용이 안되고 datetime타입에 대해 적용이 가능합니다.

datetime 타입에서는 dt 접근자로 같은 날짜 속성에 쉽게 접근할 수 있습니다.

df.new_date.dt를 my_data로 지정을 해 놓고 my_data.to_period(freq= )를 일 월 년 주기로 설정을 해서 데이터를 출력할 수 있습니다.

freq='D'는 일 주기로 출력되고 freq='M' 월 주기로 출력 freq='Y'는 년주기로 출력됩니다.

df.new_date.dt를 이용해 year, month, day을 날짜에서 분리할 수 있습니다.

to_period함수를 이용해 표기를 변경할 수도 있습니다.

freq="A"(annul)를 이용하면 연도까지 표기됩니다.

freq="M"를 이용하면 연월까지 표기됩니다.

시계열 계열을 인덱스로 두고 활용하는 방법은 어제 공부했던 set_index로 지정해주면 됩니다.

df.loc를 이용하여 인덱싱과 슬라이싱이 가능합니다.

시계열 타입이 인덱스인 경우에는, 꼭 인덱스이름과 같지 않아도 특정 연도, 연도, 연월, 연월일) 등과 같이 인덱싱과 슬라이싱이 가능합니다.

Pandas 시각화 기능

Pandas의 시리즈나 데이터프레임은 plot이라는 시각화 메서드를 내장하고 있습니다. plot은 matplotlib를 내부에서 임포트하여 사용합니다

우선 csv 자료를 읽어옵니다.

1. Scatter

df에 plot설정을 해주고 scatter chart를 그릴 수 있게 설정을 해줍니다.

scatter chart는 두 변수 간의 관계를 나타내는 그래프입니다. x,y 변수를 설정해줘야지 상관관계를 파악할 수 있습니다.

df에 있는 column값을 x='Petal.Length', y='Petal.Width'로 설정하여 줍니다.

어제 배운 plt.scatter를 이용하여 scatter chart를 그릴 수도 있습니다.

2. Histogram

df[column].plot.hist를 하면 히스토그램을 그릴 수 있습니다.

df[column]에 다수의 정보를 넣으면 다수의 히스토그램을 그릴 수 있습니다.

3. Bar

df.Species.value_counts() 도수표를 이용하여 series정보를 확인하여 my_frequencies라는 변수에 바인딩합니다.

x축에 들어갈 정보를 my_labels = list(my_frequencies.index)로 바인딩하고 y축에 들어갈 정보를 my_counts = list(my_frequencies.values)로 바인딩합니다.

df2에 plot.bar를 하면 bar chart를 생성할 수 있습니다.

4. Scatter matrix

Package함수입니다.

산점도 행렬(scatter matrix)은 데이터의 특성 중 하나를 x 축에 놓고 다른 특성 중 하나를 y 축에 놓아, 두 특성의 관계를 하나의 점으로 나타내는 그래프입니다.

2개의 특성을 묶어 2차원으로 표현하므로, 모든 특성의 관계가 나타나는 것이 아닌, 짝지어진 두 특성의 관계만 나타내게 됩니다.

pd.plotter.scatter_matrix는 산점도 행렬을 만든다는 명령어 이고 scatter_matrix에 데이터를 넣어주면 된다. 아까 추출한 df 정보와 색을 각 정보별로 다르게 표현하기 위해 my_cols_dict = {'setosa':'red', 'virginica':'green', 'versicolor':'blue'}라는 dictionary를 만들어 my_cols = [my_cols_dict[x] for x in df.Species] for함수를 통해 출력되는 specise별로 color를 출력할 수 있게 합니다.

시각화 출력을 위해 한글폰트를 설정해줍니다.

인구정보 데이터를 불러옵니다.

한글로 출력할 것이기 때문에 encoding = 'ms949'를 넣어줘야 합니다.(ms949대신 euc-kr도 가능합니다)

na_values=[' ']공백은 결측치 처리하라는 의미입니다.

맨 윗줄에 NaN으로 표시된 값은 합산이므로 dropna을 이용해 결측치를 제거해줍니다.

충청북도의 인구수를 합산하려고 할 때 청주시의 값이 중복으로 출력되는 것을 알 수 있습니다.

청주시가 아닌 값과 충청북도인 값을 조건으로 설정하여 원하는 값만 추출합니다.

위에서 설정한 조건을 새로운 변수에 바인딩해 Population 열만 추출하여 합산합니다.

성비 기준으로 남자가 1이상이고 1인가구가 2미만인 값을 추출하려고 합니다.

df[(df.GenderRatio > 1) & (df.PersInHou < 2)]로 설정하여주면 원하는 값을 얻을 수 있습니다.

위에서 추출한 값을 가지고 도시의 성별 비율을 bar chart를 그리고자 하면 x,y을 설정해줘야 합니다.

df[(df.GenderRatio > 1) & (df.PersInHou < 2)]로 얻어낸 값을 df5라고 새로 바인딩 해주고

df5에서 x축에 들어갈 city의 값을 list로 얻어오고 y축에 들어갈 genderratio를 list로 얻어옵니다.

그 값들을 다시 데이터 프레임으로 만들어 줍니다. pd.DataFrame( {'GenderRatio':my_GenderRatio}, index = my_labels)

pd.DataFrame( {'GenderRatio':my_GenderRatio}, index = my_labels)를 df6로 새로 바인딩해주고 plot.bar를 해서 bar chart를 가져옵니다.

values값을 GenderRatio을 기준으로 sorting해주고 ascending을 오름차순으로 할 껀지 내림차순으로 할 껀지 정해서 깔끔한 그래프 형태를 얻어올 수 있습니다.

대기질에 관련된 정보를 읽어옵니다.

df내의 region를 east와 west로 구별하여 불러옵니다.

df.region=='east'와 df.region=='west'를 각각 df2와 df3으로 바인딩해줍니다.

그리고 행의 개수를 이용하여 데이터 프레임을 만들어 줍니다.

만든 데이터프레임을 df4로 바인딩해주고 plot.bar를 이용하여 bar차트를 만들어 줍니다.

위에서 추출했던 pm25의 자료를 가지고 히스토그램을 만들 수도 있습니다.

여러개의 히스토그램을 만들어 비교하는 것도 가능합니다. 출력값의 차이가 너무 커서 완전한 비교가 어렵습니다.

그럴 경우에는 density를 True로 설정해 밀도로 나타내면 비교정도를 쉽게 파악할 수 있습니다.

scatter chart를 그릴 땐 histgram과 달리 그냥 두개의 그래프를 나열하는 것이 아닌 상단에 적는 그래프를 새로운 변수로 바인딩해서 아래 적는 두번째 scatter chart의 ax에 넣어줘야지 출력이 가능합니다.

하위 scatter chart에 변수를 바인딩하여 ax넣었을 경우 상단의 scatter chart만 출력됩니다.

넣고 싶은 값들을 지저하여 scatter_matrix를 하는 것도 가능합니다.

중간중간에 이해 안가는 것도 몇개있었지만 구글링통해서 공부하면서 겨우 따라간듯 하다...

아니..나 정처기는 언제하고 html 강의 제공되는 건 언제 들을 수 있냐고ㅠㅠ

그래도 내일만 지나면 주말이니까 주말에 좀 늦잠좀 자면서 해야겠댱

오늘 나자신 수고했습니다

이상 엘리였습니다.

저작자 명시 필수영리적 사용 불가내용 변경 불가

저작자 명시 필수- 영리적 사용 불가- 내용 변경 불가

공감이 글에 공감한 블로거 열고 닫기

댓글2 이 글에 댓글 단 블로거 열고 닫기

인쇄

[비전공자 코딩공부 6월 24일 24일차] Pandas(2) (2024)

References

Top Articles
Latest Posts
Article information

Author: Lilliana Bartoletti

Last Updated:

Views: 6051

Rating: 4.2 / 5 (53 voted)

Reviews: 92% of readers found this page helpful

Author information

Name: Lilliana Bartoletti

Birthday: 1999-11-18

Address: 58866 Tricia Spurs, North Melvinberg, HI 91346-3774

Phone: +50616620367928

Job: Real-Estate Liaison

Hobby: Graffiti, Astronomy, Handball, Magic, Origami, Fashion, Foreign language learning

Introduction: My name is Lilliana Bartoletti, I am a adventurous, pleasant, shiny, beautiful, handsome, zealous, tasty person who loves writing and wants to share my knowledge and understanding with you.