드디어 Pandas!! 공부하기 전에 여러 곳에서 pandas를 이용해서 데이터를 표현하는 시각화들을 많이 봐왔다. 이제 직접 내가 시각화를 구현할 수 있게 됐다. 공부해보고나니 정말 편리한 모듈이다.
1. Pandas 란
- pandas는 데이터 시각화와 분석을 하기위한 모듈이다.
- numpy 모듈과 똑같이 'import pandas as pd ' 로 모듈을 import한다.
- pandas의 Series : 1개의 column(1차원)을 Series라고 한다.
# Series()
>>> pd.Series([1, 2, 3, 4])
# 이는 아래와 같이 풀 수 있는데, Series는 하나의 컬럼이라 생각하면 되는 것을 알 수 있다.
>>> a = [1, 2, 3, 4]
>>> pd.Series(a)
-> 왼쪽이 index, 오른쪽 줄이 data이다.
- DataFrame : 서로 다른 데이터 타입이 2차원 형태로 저장된 배열 (python)로, 데이터를 처리하기 좋은 형태이다.
- pd.DataFrame() : list로 DataFrame 만들어주는 메서드
# list로 DataFrame 만들기
# list로 DataFrame 만들기
>>> company1 = [['삼성', 1000000, '갤럭시노트'],
['애플', 1200000, '아이폰'],
['엘지', 900000, '윙']]
>>> print(pd.DataFrame(company1)) # list를 dataframe으로 만들어주는 pd.DataFrame 메서드
# DataFrame으로 새로운 변수에 저장하기.
>>> df1 = pd.DataFrame(company1)
>>> print(df1) # 당연히, 위 출력과 같은 결과이다.
# DataFrame의 column명 지어주기
>>> df1.columns = ['회사명', '가격', '제품명']
>>> print(df1) # 3개의 컬럼(열)에 이름이 붙은 것을 확인 가능하다.
- 마지막 print 출력값에서 column명이 붙은 것을 확인할 수 있다.
# dict(dictionary)로 DataFrame 만들기
- dictionary는 {} (중괄호)로 생성하고, key와 value 쌍으로 생성해주면 된다.
- value 부분을 배열로 저장하게 되면 [] (대괄호)로 따로 묶어줘야 한다.
>>> company2 = {'회사명':['삼성','애플','엘지'],
'가격':[1000000, 1200000, 900000],
'제품명':['갤럭시노트','아이폰','엘지폰']}
>>> df2 = pd.DataFrame(company2)
>>> print(df2) # 결과는 위의 코드와 같은 결과이다.
- 여기서 df1['회사명'] 이라 치면 무엇이 나올까?
0 삼성
1 애플
2 엘지
다음과 같이 나오는데, 이를 '회사명'의 index라고 한다. (배열에서의 index도 마찬가지로 열과 행의 위치를 가리키는데 쓰인다.)
이것은 하나의 column이기도 하다.
어떻게 아느냐면, type(df1['회사명']) 을 치면 Series로 속성이 나오기 때문이다. 위에서도 말했듯이, Series는 하나의 Column이다.
>>> df1['회사명']
# 다음과 같이 출력된다.
0 삼성
1 애플
2 엘지
Name: 회사명, dtype: object
# df1의 '회사명'의 index를 저장하고, type을 검색해보면
>>> df1.index = df1['회사명']
>>> df1.index
Index(['삼성', '애플', '엘지'], dtype='object', name='회사명') # 출력
>>> type(df1['회사명'])
# 다음과 같이 출력되므로, 하나의 column이라 알아놓으면 된다.
<class 'pandas.core.series.Series'>
이제 직접 적은 용량의 데이터가 있는 CSV 파일을 가져와서 다뤄보겠다.
2. CSV 파일 읽어오기
- Comma Separated Value의 약어로써, 쉼표로 구분되어 데이터가 저장된 파일이다.
- 엑셀도 로딩이 가능하지만, 쉼표로 구분된 SCV 파일이 훨씬 가볍고 용량이 적다.
- 공공 데이터 포털(https://www.data.go.kr/)에서도 CSV 포멧의 파일을 많이 제공하고 있다.
첫번째 글에서 해봤던 CSV 파일을 읽어와서 변수에 넣어놓고 시작하겠다.
>>> import pandas as pd
>>> df = pd.read_csv('http://bit.ly/ds-korean-idol')
>>> type(df)
# CSV파일을 저장한 df의 type은 데이터 처리가 쉬운 DataFrame으로 출력된다.
pandas.core.frame.DataFrame
- df를 출력해보면 내용은 다음과 같다.
2-1. 기본 정보 알아보기 (index, column, info)
# column(열) 출력하기
>>> df.columns
# 다음과 같이 출력된다.
Index(['이름', '그룹', '소속사', '성별', '생년월일', '키', '혈액형', '브랜드평판지수'], dty
pe='object')
# columns의 이름 바꾸기
>>> new_col=['name', 'group', 'entertainment', 'sex', 'birth', 'height', 'blood_type', '브
랜드평판지수'] # 새로운 column 이름을 저장해준 후,
>>> df.columns = new_col # columns에 넣어주면 바뀐다.
>>> df.columns
# 다음과 같이 출력된다.
Index(['name', 'group', 'entertainment', 'sex', 'birth', 'height',
'blood_type', '브랜드평판지수'],
dtype='object')
# index(행) 출력하기
>>> df.index
RangeIndex(start=0, stop=15, step=1) # 행의 정보를 출력한다. 0부터 15전까지 1 간격
- 구체적으로 말하자면, columns 메서드는 배열의 열 이름(name)을 출력하고, index 메서드는 행의 정보를 알려준다.
# info
- info 메서드는 기본적인 열의 정보와 데이터 타입을 알려주는데, 주로 데이터 타입, null값을 볼 때 자주 활용한다.
>>> df.info
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15 entries, 0 to 14
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 name 15 non-null object
1 그룹 14 non-null object # 1개의 null값 존재하는 것을 예측할 수 있다.
2 소속사 15 non-null object
3 성별 15 non-null object
4 생년월일 15 non-null object
5 키 13 non-null float64 # 2개의 null값 존재하는 것을 예측할 수 있다.
6 혈액형 15 non-null object
7 브랜드평판지수 15 non-null int64
dtypes: float64(1), int64(1), object(6)
memory usage: 1.1+ KB
# 통계 정보 알아보기
- describe 메서드로 계산가능한 (수치) 열들의 통계정보를 보여준다. ex) '키', '브랜드평판지수'
- 총 개수(null제외), 평균, 표준편차, 최소값, 사분위, 최대값을 보여준다.
- df.describe는 df를 보여주고, df.describe()가 통계정보를 보여주는 것이니 헷갈리지 말자.
>>> df.describe()
height 브랜드평판지수
count 13.000000 1.500000e+01
mean 175.792308 5.655856e+06
std 5.820576 2.539068e+06
min 162.100000 2.925442e+06
25% 174.000000 3.712344e+06
50% 177.000000 4.668615e+06
75% 179.200000 7.862214e+06
max 183.000000 1.052326e+07
# 형태(shape) 알아보기
- shape는 tuple 형태로 반환되며, 첫번째는 row(행), 두번째는 column(열)의 개수를 의미한다.
>>> df.shape
(15, 8)
+) 차원을 알려주는 메서드는 numpy 모듈의 ndim()이 있다. np.ndim(df)의 결과는 2일 것이다. 2차원이기 때문에!
# 상위 5개, 혹은 하위 5개의 정보만 확인하기
>>> df.head()
# default는 5개이다.
name group entertainment sex birth height blood_type 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
3 뷔 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
>>> df.tail()
name group entertainment sex birth height blood_type 브랜드평판지수
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
# 세 줄만 보고 싶다면 괄호 안에 넣으면 된다.
>>> df.head(3)
name group entertainment sex birth height blood_type 브랜드평판지수
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
# 정렬하기
- default는 오름차순 정렬이다.
- sort_index() 메서드를 이용한다. index를 기준으로 정렬한다는 의미이다.
- 위에서 df를 치면 나오는 결과와 같으니 생략하겠다.
- 내림차순 정렬을 원하면 ascending=False 옵션을 추가해주면 된다. 출력되는 모습은 14번째부터 0번째까지의 순서로 출력된다.
# index를 기준으로 오름차순 정렬
df.sort_index()
# index를 기준으로 내림차순 정렬
df.sort_index(ascending=False)
# Column별로 정렬하기
- index 기준이 아닌, 'height' 와 같은 열 이름을 기준으로 정렬할 수 있다.
- 이때는 sort_values() 메서드를 이용하고, by='' 옵션으로 정렬할 기준의 열 이름을 지정한다.
- 이또한 내림차순 정렬을 하기위해서는, ascending=False 옵션을 사용한다.
>>> df.sort_values(by='height')
name group entertainment sex birth height blood_type 브랜드평판지수
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
3 뷔 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
8 진 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
# 1차 정렬 후, 동일한 값에 대해 2차 정렬하기
- 1차 정렬을 한 후에 같은 값에 대해서 2차로 정렬을 하도록 설정할 수 있다.
- 만약 'height'로 정렬했는데 같은 키인 데이터가 있으면 '브랜드평판지수'로 정렬하려면, by옵션에 추가해주면된다.
- 이때 by옵션에 추가하게되면 배열로 써줘야한다.
>>> df.sort_values(by=['height','브랜드평판지수'])
name group entertainment sex birth height blood_type 브랜드평판지수
4 화사 마마무 RBW 여자 1995-07-23 162.1 A 7650928
9 하성운 핫샷 스타크루이엔티 남자 1994-03-22 167.1 A 4036489
0 지민 방탄소년단 빅히트 남자 1995-10-13 173.6 A 10523260
14 슈가 방탄소년단 빅히트 남자 1993-03-09 174.0 O 2925442
12 백호 뉴이스트 플레디스 남자 1995-07-21 175.0 AB 3301654
13 JR 뉴이스트 플레디스 남자 1995-06-08 176.0 O 3274137
1 지드래곤 빅뱅 YG 남자 1988-08-18 177.0 A 9916947
5 정국 방탄소년단 빅히트 남자 1997-09-01 178.0 A 5208335
3 뷔 방탄소년단 빅히트 남자 1995-12-30 178.0 AB 8073501
8 진 방탄소년단 빅히트 남자 1992-12-04 179.2 O 4570308
2 강다니엘 NaN 커넥트 남자 1996-12-10 180.0 A 8273745
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
10 태연 소녀시대 SM 여자 1989-03-09 NaN A 3918661
7 소연 아이들 큐브 여자 1998-08-26 NaN B 4668615
- '정국'과 '뷔'가 178.0으로 값이 동일하므로, '브랜드평판지수'를 기준으로 다시 오름차순을 해주게 된다.
- 이또한 내림차순이 가능한데, 내림차순으로 하게되면 '뷔'가 더 위에 있게 된다. (값이 더 적기 때문에)
# Column(열)을 선택하기
- df['blood_type']은 하나의 column이자 Series이다.
즉, type(df['blood_type'])의 결과가 pandas.core.series.Series로 나올 것이다.
- df['blood_type']과 df.blood_type은 같은 결과가 나온다.
- 이렇게 하나의 column을 선택할 수 있다.
>>> df.blood_type
0 A
1 A
2 A
3 AB
4 A
5 A
6 O
7 B
8 O
9 A
10 A
11 B
12 AB
13 O
14 O
Name: blood_type, dtype: object
# 범위 선택하기 (range selection)
- df.head(3)은 데이터의 상위 3줄을 보여준다고 위에서 언급했다.
- df[:3] 으로 같은 결과를 보여줄 수 있다. 즉, 범위를 선택할 수 있다.
# loc 메서드 (굉장히 많이 사용한다!!)
- df.name은 df.loc[:, 'name'] 으로 표현할 수도 있다.
- 즉, 모든 행을 보여주는데 'name' 컬럼만 보여주라는 명령어다.
- 결과는 물론 df.name과 같을 것이다.
- 두개의 행을 보여주고 싶다면? 컬럼 부분에 두개를 적어주면 된다. 단, 괄호로 묶어줘야한다.
>>> df.loc[:, ['name','birth']]
name birth
0 지민 1995-10-13
1 지드래곤 1988-08-18
2 강다니엘 1996-12-10
3 뷔 1995-12-30
4 화사 1995-07-23
5 정국 1997-09-01
6 민현 1995-08-09
7 소연 1998-08-26
8 진 1992-12-04
9 하성운 1994-03-22
10 태연 1989-03-09
11 차은우 1997-03-30
12 백호 1995-07-21
13 JR 1995-06-08
14 슈가 1993-03-09
- 당연히 행에 대해서도 여러개 보여줄 수 있는데, 범위를 정해서 보여준다.
>>> df.loc[3:8, ['name','birth']] # 3 ~ 8 까지 열에 대해서 두 행만 보여준다.
name birth
3 뷔 1995-12-30
4 화사 1995-07-23
5 정국 1997-09-01
6 민현 1995-08-09
7 소연 1998-08-26
8 진 1992-12-04
- 행과 같이, 열도 범위로 보여주고 싶다면
>>> df.loc[3:7,'name':'birth'] # 'name'부터 'birth'까지의 모든 열을 보여준다.
name group entertainment sex birth
3 뷔 방탄소년단 빅히트 남자 1995-12-30
4 화사 마마무 RBW 여자 1995-07-23
5 정국 방탄소년단 빅히트 남자 1997-09-01
6 민현 뉴이스트 플레디스 남자 1995-08-09
7 소연 아이들 큐브 여자 1998-08-26
# 이름이 아닌 index로 가져오기
- iloc 메서드를 사용한다.
- index로 사용하기 때문에 df.iloc[1:5, 0:2]를 하게 되면 행은 1 ~ 5-1(4)까지, 열은 0 ~ 2-1(1)까지 보여준다.
>>> df.iloc[3:7, [0,2]] # 행: 3 ~ 6, 열: 0 ~ 1
name entertainment
3 뷔 빅히트
4 화사 RBW
5 정국 빅히트
6 민현 플레디스
>>> df.iloc[3:7,0:2] # 행: 3 ~ 6, 열: 0, 2
name group
3 뷔 방탄소년단
4 화사 마마무
5 정국 방탄소년단
6 민현 뉴이스트
# 조건을 활용한 색인(indexing)
- 조건을 사용하게 되면 무조건 결과값은 Boolean형으로 출력된다.
>>> df['height'] > 180 # 'height'가 180 이상인 행만 True로 출력된다.
0 False
1 False
2 False
3 False
4 False
5 False
6 True
7 False
8 False
9 False
10 False
11 True
12 False
13 False
14 False
Name: height, dtype: bool
- 위의 df['height'] > 180 을 다시 df에 넣게 되면 True인 행들만 출력된다.
- 즉, index 0부터 14까지 True인 값만 색인해내는 것.
>>> df[df['height'] > 180]
name group entertainment sex birth height blood_type 브랜드평판지수
6 민현 뉴이스트 플레디스 남자 1995-08-09 182.3 O 4989792
11 차은우 아스트로 판타지오 남자 1997-03-30 183.0 B 3506027
- 해당 출력되는 행에 대해 특정 열만 보여주고자 한다면 뒤에 []로 붙여주면된다.
>>> df[df['height'] > 180]['name'] # 색인된 행의 'name'열만 보여주기.
6 민현
11 차은우
Name: name, dtype: object
>>> df[df['height'] > 180][['name', 'height']] # 색인된 행의 2개이상 행 보여줄 때는 괄호로 묶어준다.
name height
6 민현 182.3
11 차은우 183.0
- 코드 주석으로도 설명했지만, 색인된 행에 대해 특정 열만 보여줄 때는 뒤에 괄호[ ]로 덧붙이면 되는데,
해당 특정 열이 2개 이상이라면, 괄호로 묶어줘야한다. (위에서도 언급했다.)
- 그리하여 결국 2개의 괄호로 감싸게 된다.
- 하지만 더 추천하는 문장은 다음이다.
>>> df.loc[df['height' > 180], 'name']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '>' not supported between instances of 'str' and 'int'
# 에러가 난 이유는 괄호의 위치 때문이다.
# loc의 문법을 다시 봐보자면, df.loc[행, 열] 순으로 작성한다. 행&열에 대해 범위로도 표현할 수 있고, 지정할 수도있다.
# df.loc[:, 'name']은 모든 행에 대해 'name' 열만 보여준다.
# 이제 df.loc[ df['height']>180, 'name']을 보면
# 모든 행이 아닌, 키가 180 이상인 행에 대해 'name' 열만 보여준다.
# 이것을 이해하고 나면 위의 오류는 어이없는 실수란 것을 알 수 있다.
# correct
>>> df.loc[ df['height'] > 180, 'name']
6 민현
11 차은우
Name: name, dtype: object
# 열도 범위로 지정할 수 있다.
>>> df.loc[ df['height'] > 180, 'name':'sex']
name group entertainment sex
6 민현 뉴이스트 플레디스 남자
11 차은우 아스트로 판타지오 남자
# 2개 이상의 특정 열을 지정한다면 괄호로 묶어준다.
>>> df.loc[ df['height'] > 180, ['name', 'height'] ]
name height
6 민현 182.3
11 차은우 183.0
# isin을 활용한 색인(indexing)
- 내가 조건을 걸고자 하는 값이 내가 직접 정의한 list 안에 있을 때만 색인하려는 경우
- 말은 이해가 안되니 코드와 결과값을 봐보자.
- 결과는 Boolean형으로 출력된다.
>>> my_condition = ['플레디스', 'SM']
>>> df['entertainment'].isin(my_condition) # 'entertainment' 열에서 '플레디스'와 'SM'에 속한 행만 True.
0 False
1 False
2 False
3 False
4 False
5 False
6 True
7 False
8 False
9 False
10 True
11 False
12 True
13 True
14 False
Name: entertainment, dtype: bool
- 이제 True인 행을 보여주자.
>>> df.loc[ df['entertainment'].isin(my_condition), 'entertainment' ] # 해당 조건에 해당하는 열에 대해 'entertainment'행만 보여주기.
6 플레디스
10 SM
12 플레디스
13 플레디스
Name: entertainment, dtype: object
# 보여줄 열을 2개이상으로 지정할 수 있다. 괄호로 묶어서!
>>> df.loc[ df['entertainment'].isin(my_condition), ['name','entertainment'] ]
name entertainment
6 민현 플레디스
10 태연 SM
12 백호 플레디스
13 JR 플레디스
# 결측값(Null) 알아보기
- Null 값은 비어있는 값, 결측값이라고 한다.
- pandas에서는 Nan -> Not a Number로 표시된다.
- null값 확인하는 방법
- df # 전체 데이터를 보여주는 명령어로, 결측값에는 'NaN' 표시가 되어있다.
- df.info() # Non-Null Count 라는 항목으로 채워져있는 필드 수를 보여주는데, 이를 통해 null값이 몇개 있는지 알수있다.
- df.isna() # NaN인 부분을 True로 나타내는 메서드. 전체 데이터를 Boolean값으로 나타낸다.
- df['컬럼이름'].isnull() # 특정 컬럼(열)에서 null인 열을 출력
4-1. df['컬럼이름1'][df['컬럼이름2'].isnull()] # 4번 명령어를 뒤에 붙임으로써, 해당 컬럼에서 찾은 null값의 상세정보(컬럼이름1)을 보여준다. 이해가 안되면 코드를 봐보자.
>>> df['height'].isnull() # height 열에서 null인 행의 height을 보여준다.
7 NaN
10 NaN
>>> df['name'][df['height'].isnull()] # height 열에서 null인 행의 다른 컬럼을 지정하여 볼 수 있다.
7 소연
10 태연
# 결국 df['height'][df['height'].isnull()] 은 첫번째 명령어의 결과와 같을 것이다.
5. df['컬럼 이름'].notnull()] # 해당 컬럼(열)에서 null이 아닌 열을 출력
-> 이것도 4-1번과 같이 해당 컬럼에 대해 null이 아닌 행의 다른 정보(열)를 보여줄 수 있다.
- 그런데 4-1번은 너무 복잡하니, 대신 추천하는 것은 loc 메서드를 쓰는 것이다.
>>> df.loc[ df['height'].isnull(), ['name', 'height']] # 'height' 열에서 null값인 행에 대해 'name'과 'height' 열을 보여줘라.
name height
7 소연 NaN
10 태연 NaN
이외에 추가적인 메서드는 다음 글에서 이어 소개하겠다.
'Python' 카테고리의 다른 글
[colab] 4. colab으로 데이터 전처리 실습하기 (0) | 2021.01.22 |
---|---|
[colab] 3. colab으로 pandas 모듈 사용하기(2) (0) | 2021.01.21 |
[colab] 2. colab으로 Numpy 모듈 사용하기 (0) | 2021.01.19 |
[colab] 1. 코랩 설치 및 기초 명령어 (0) | 2021.01.17 |
파이썬 기초 문법2 (함수와 람다 표현식, 라이브러리) (0) | 2021.01.02 |