-
2022년 12월 2일 금요일(엑셀파일 읽어오기,쓰기,데이터의 시각화(그래프))개발/개발일지(국비지원) 2022. 12. 2. 20:23728x90
pandas모듈을 이용하여
표형태의 데이터를 처리해줄것이다.
Series: 1차원형태의 배열
DataFrame:2차원형태의 배열 을 처리해줄수 있다.
import pandas as pd :편의를위해 pd라는 알리아스(별명)을 설정한다.
dict_data ={ '키값':밸유값}
키값과 밸유값을 쌍으로가진 딕셔너리 데이터이다.
df에 pandas 모듈을 이용하여 DataFrame으로생성해주는데
데이터들로는 위에 딕셔너리 데이터를 넣어준다.
이때 인덱스(행)의 값은 'r0','r1','r2'로 설정해준다.
index값을 따로 설정해주지않으면
r0,r1,r2대신 기본값으로 0,1,2 숫자가 인덱스값으로 들어간다.
결과)
c0 c1 c2 c3 c4
r0 1 4 7 10 13
r1 2 5 8 11 14
r2 3 6 9 12 1539-43행
현재df객체에는 위처럼 r0,r1,r2 3가지행밖에존재하지않는다.
하지만
ndf 라는 객체를 새로만들고
ndf = df.reindex(['r0','r1','r2','r3','r4'])를하게되면
ndf객체에는
r3,r4라는 행이 추가되고
그에 해당하는 컬럼값들은 현재 존재하지않기때문에 NaN이라는 값을 출력해준다.
NaN은 값이 없다는 의미로 결측값 이라고도 불린다.
결과)
c0 c1 c2 c3 c4
r0 1.0 4.0 7.0 10.0 13.0
r1 2.0 5.0 8.0 11.0 14.0
r2 3.0 6.0 9.0 12.0 15.0
r3 NaN NaN NaN NaN NaN
r4 NaN NaN NaN NaN NaN45-47행
ndf2객체에도
df의객체에 r3,r4라는 행을 추가한다.
하지만 아까와 다른점은
reindex(['r0','r1','r2','r3','r4'],fill_value=0)
fill_value=0 을 뒤에 추가해주었다.
이 의미는 NaN인 값을 0이라는값으로 채워준다는의미이다.
결과를보면 더 빠르게 이해된다.
결과)
c0 c1 c2 c3 c4
r0 1 4 7 10 13
r1 2 5 8 11 14
r2 3 6 9 12 15
r3 0 0 0 0 0
r4 0 0 0 0 049-55행
정렬하기.
sort_index() : 인덱스명으로 정렬
sort_values() : 기준컬럼의 값으로 정렬
df객체는 현재
c0 c1 c2 c3 c4
r0 1 4 7 10 13
r1 2 5 8 11 14
r2 3 6 9 12 15이러한 값을 가지고있다.
인덱스명으로 조회를 하게되면 결과는 달라지지않을것이다.
하지만 인덱스명으로 내림차순정렬을 하게되면 달라질것이다.
sort_index(ascending=False)
이뜻은 오름차순정렬을 하지않는다는것이다.
즉 입력하지않았을때는 기본값으로 오름차순정렬이된다.
내림차순결과) 컬럼의 순서가 바뀐다.
c0 c1 c2 c3 c4
r2 1 4 7 10 13
r1 2 5 8 11 14
r0 3 6 9 12 15이번에는 sort_values(by='c1',ascending=False)로
컬럼의 값을 기준으로 내림차순정렬을 해보았다.
컬럼의 값을 기준으로해야하기때문에
원하는 컬럼을 by='컬럼명'을 추가로 설정해줘야한다.
컬럼 내림차순정렬 결과)
c0 c1 c2 c3 c4
r2 3 6 9 12 15
r1 2 5 8 11 14
r0 1 4 7 10 13설정해준 c1컬럼을 기준으로
가장높은 6>5>4 순서로 내림차순정렬이 된 모습을 확인할 수 있다.
57-62행
exam_data : 딕셔너리 데이터를
df객체에 DataFrame객체로 생성하면서 넣어준다.
현재)
이름 수학 영어 음악 체육
0 서준 90 98 85 100
1 우현 80 89 95 90
2 인아 70 95 100 9064-65행
현재 컬럼으로 설정된 '이름'컬럼을
인덱스로 바꿔줄것이다.
set_index('해당컬럼명',inplace=True)
inplace=True를 하지않으면 변경된 값이 저장안되니 꼭 해줘야한다.
결과)
이름 수학 영어 음악 체육
서준 90 98 85 100
우현 80 89 95 90
인아 70 95 100 90이러한형태로 컬럼이었던 이름이 인덱스로 변경된것을 확인할 수 있다.
이름의 역순과 영어점수의 역순으로 정렬하는방법은
위에서 했던방식과 똑같이 진행하면된다.
78-82행
dataFrame객체의 컬럼을 조회할때에는
데이터프레임객체명['컬럼명']을 해주면
해당 컬럼의 값들을 출력할수있다.
이걸이용하여
df['총점']=df['수학']....+df['체육]을 입력해주면
총점이라는 컬럼이 생성되면서
입력해준 컬럼들의 연산결과를 맨오른쪽끝에 출력될것이다.
이름 수학 영어 음악 체육 총점
서준 90 98 85 100 373
인아 70 95 100 90 355
우현 80 89 95 90 354105-111행
seaborn 모듈을 사용하기위해 import해준다.
seaborn은 데이터를 시각화해주기위한 모듈(도구)이다.
seaborn을 앞으로 sns로 별명설정을해서 사용할것이다!
108행
seaborn모듈에 저장된 데이터셋 목록을 출력해준다.
그중 하나인 titanic데이터로 학습을할것이다.
titanic변수에 sns(seaborn).load_dataset('titanic')
sns모듈에서 titanic이름을가진 데이터셋을 가져와서
titanic변수에 저장해준다.
113-116행
데이터객체.head() : 상위5개의 데이터만 불러온다.
head(갯수)를 입력하면 원하는 갯수의 상위 데이터를 불러올수있다.
현재 titanic객체는 DataFrame객체로 2차원배열형태인데,
원하는컬럼의 상위5개만 조회하고싶을때는,
titanic[['컬럼명1','컬럼명2']].head()를 입력해주면
원하는 결과를 가져올수있다.
118-124행
컬럼별로 건수를 조회하고싶을때는
titanic.count()를 입력해주면
결측값을 제외한 데이터들을 조회할수있다.
건수중에 가장 작은값을 조회하고싶을때는
titanic.count().min()
만 추가해주면 원하는 값을 얻을수있다.
가장 적은수의 인덱스를 알고싶을때는
titanic.count().idxmin()
idx만 추가해준다면 원하는 값을 얻을 수 있다.
126-128행
2가지이상의 컬럼을 출력하기위한 방법이다.
df = titanic[['age','fare']]
대괄호:[ ] 를 2개를 사용해줘야한다.
129-133행
평균을 구할수있는 함수 mean()
최대값을 구할수있는 max()
최소값을 구할수있는 min()
함수를 사용하여 원하는값을 얻을 수 있다.
134-138행
df.age.value.counts().head()
df객체에서 나이컬럼의 값을 모두조회한다.
모두조회한값중 head()를 통해 상위5개의 값들을 조회하여 출력해준다.
head(10) : head('원하는 데이터갯수')를 입력해주면
원하는 결과를 얻을 수 있다.
141-147행
titanic[titanic['age]==titanic['age'].max()]
타이타닉객체 전체에서
타이타닉[나이]컬럼이 == 타이타닉[나이]컬럼중 가장높은값인
데이터를 출력해준다.
titanic['age'].idxmax()
타이타닉 컬럼중 나이컬럼의 최대값을가진 행의값을 조회해준다.
titanic.iloc[titanic['age'].idxmax()]
타이타닉 컬럼중 나이컬럼의 최대값을가진 행의값을 조회해주고
조회된 행 ex)300번행
300번행의 모든데이터들을 출력해준다.
149-152행
생존여부에 관한 컬럼인
survived와 alive를 이용하여
titanic['survived'].value.counts()
value.counts()를 사용하여 해당컬럼의 건수를 조회한다.
154-156행
성별로 인원수 조회하는방법이다
위에했던 방법과 동일하고
컬럼명만 변경된다.
158-162행
성별로 생존건수를 조회해보았다.
titanic[['컬럼명1','컬럼명2']].value_counts()
을 통해 쉽게 결과를 얻을 수 있었다.
위의 방식과동일하지만 2개이상의 컬럼을 조회할때에는
[]: 대괄호의 갯수를 잘 확인 후 사용해야한다.
164-167행
객체.corr()을 사용하면
해당하는 객체에 상관관계를 알수있다.
상관관계란
예를드면 자동차의 무게가 많이 나갈수록 연비가 많이든다.
처럼 서로간의 관계여부에대해
1~-1값으로 표현해준다.
194-196행
컬럼별로 건수를 조회하는
두가지방법이다.
1 .데이터객체명.컬럼명.value_counts()
2. 데이터객체명['컬럼명'].value_counts()
198-200행
컬럼의 값을 조회하는 방법이지만
위와 다른점은 중복되는 값은 제거하여 조회한다는점이다.
mpg.origin.unique()를 사용해주면 가능하다.
202-204행
자동차의 출시년도를 출력한다.
203행: 중복된값을 제거하여 출력하는 unique()
204행: 출시년도에 생산된 자동차건수를 모두출력해준다.
211행
해당하는 데이터의 행과 열의 갯수를 출력할수있다.
212-215행
mpg.shape는 튜플데이터로
(열,행)의 형태로 되어있기때문에
행의 값을 조회하고싶을때는 mpg.shape[0]
열의 값을 조회하고싶을때는 mpg.shape[1]
을 사용해준다.
227-228행
기술통계정보를 조회하는 함수이다.
데이터객체명[['컬럼1','컬럼2']].describe(include='all')
데이터의 컬럼1,2에 해당하는 기술통계정보 모두가 조회된다.
254-257행
데이터를 시각화하기위해
그래프로 나타내는방법이다.
데이터명.plot(x='x축에사용할 컬럼' , y='y축에사용할 컬럼', kind='그래프종류')
▼로 설정해준다. 산점도그래프가 생성된다.▼
데이터의 시각화 산점도그래프 257행
▼해당데이터의 해당컬럼의 빈도수도 확인할 수 있다.▼
266-270행
위에서 xlsx파일의 데이터를 df에 저장하였다.
df를 출력해보았을때
남한과 북한의 index는 0과 5이기 때문에
ndf = df.iloc[[0,5]]
남한과북한의 데이터만 ndf객체에 저장해준다.
2열이후의 값들만 저장해주기위해
ndf = df.iloc[[0,5],2:]
2:를 추가해준다.
2:의 의미는 앞에서 배웠듯이
2열부터 끝열까지를 의미한다.
272행 실행결과 위에서 저장한데이터인 ndf를 선그래프로 시각화하면
이러한 그래프가 출력이된다.
막상 출력해보니 보기가 매우불편하다.
위에서 알수있듯이 컬럼명의 수만큼 그래프가 그려진걸 확인할 수 있다.
그렇다면 현재 열로되어있는 남한,북한을
컬럼으로 바꿔주면 그래프의 형태가달라질것이다.
274-279행
ndf2객체를 새로 생성해주고
ndf2 = ndf.T를 사용해주면
현재 열인(남한=0, 북한=5)를 .T를 사용해서 열과 행의 위치를 바꿔준다.
280-283행
하지만, 지금남한=0 북한=5숫자로 표기되어있어서 더 직관적으로 해주기위해컬럼명을바꿔준다(위에서 열에서 행으로바꿔줬다.)
컬럼명은 ndf2.columns=['south','north']로 바꿔준다.
284-285행
바꾼결과값을 선그래프로 한번 확인해본다.
▼그래프가 출력될때 범례는 컬럼명으로 출력 될 것이다.▼
289-293행
데이터값의 형태를 변환해주기위해
데이터명.astype(int)을 사용했다.
마지막으로
남한/북한의 전력량의 사용 빈도를
▼시각화해서 쉽게 이해할수있다.▼
296-300행
외부에서 엑셀파일을 읽어왔다.
읽어온 데이터에서 '전출지별'컬럼의 상위5개데이터만 조회해보았다.
결과)
0 전출지별
1 전국
2 NaN
3 NaN
4 NaN
Name: 전출지별, dtype: object2,3,4행도 전국이지만
엑셀에서 읽어온 데이터이기때문에 NaN으로 표기된다.
301-305행
위에 NaN(결측값)이 보기가 안좋기때문에
결측값을 앞의 데이터 전국으로 채워준다.
df = df.fillna(method='ffill')을 사용하여
결측값들을 앞의 데이터로 채워준다.
상위5건 결과)
0 전출지별
1 전국
2 전국
3 전국
4 전국
Name: 전출지별, dtype: object하위5건 결과)
320 제주특별자치도
321 제주특별자치도
322 제주특별자치도
323 제주특별자치도
324 제주특별자치도
Name: 전출지별, dtype: object318-320행
컬럼명을 변경해주는 방법이다.
df_seoul.rename(columns={'원래컬럼명':'바꿀컬럼명'},inplace=True}
inplace=True를 작성해야 변경된값이 저장된다!
321-324행
컬럼을 제거하는 방법이다.
이전에 다뤘던내용이지만 한번 더 나왔다..!
해당데이터객체.drop('지울컬럼명',axis=1)
axis=0일땐 행(인덱스) , axis=1일땐 열(컬럼)
325행-328행
전입지 컬럼을 인덱스로 설정하는방법이다.
해당데이터명.set_index('컬럼명',inplace=True)
여기서도 마찬가지 inplace=True를 해줘야 변경된값이 저장된다.
330-332행
경기도로 이동한 데이터만 sr1에 저장이되어있다.
저장된 데이터를 시각화하여
▼출력해보면 이러한 그래프가 출력된다.▼
333행-336행
위에 값에서 전국의 컬럼을 추가해서
선 그래프로 출력해본다.
출력하기전에, 열과 행의 위치를바꿔줘야
원하는 형태의 그래프를 출력할 수 있다.
▼결과▼
하지만,, 자세히보면 범례가 아주맘에안든다.
한글값을 읽어오지 못한것이다.
이것을 수정하기위해서 밑에서 다뤄볼것이다.
338행-346행
한글이 가능한 폰트로 설정하기위해서
import matplotlib.pyplot as plt
모듈을 임포트해준다.
폰트종류와 타이틀,x축과 y축의 이름을 지어주고
실행해보자.
x축의 데이터의 값들이 겹쳐서 잘 보이지 않기때문에
plt.xticks(rotation=45)를 추가해서
기울기를 설정해주었다.
▼결과▼
728x90'개발 > 개발일지(국비지원)' 카테고리의 다른 글
2022년 12월 6일 화요일(데이터의 시각화) (0) 2022.12.06 2022년 12월 5일 월요일(matplot 시각화모듈,엑셀데이터를 이용한 데이터의 시각화) (0) 2022.12.05 2022년 12월 2일 금요일(엑셀파일 불러오기,수정관련 문제풀이) (0) 2022.12.02 2022년 12월 1일 목요일(엑셀파일을 파이썬으로 읽어와서 작업하기) (0) 2022.12.01 2022년 12월 1일 목요일(파일/폴더 복사,알고리즘,테이블조회 문제풀이) (2) 2022.12.01