티스토리 뷰
이전에 공부했던 numpy 와 함께 통계에 많이 쓰이는
pandas 모듈에 대해 알아봅시다 :)

[pandas]
- 데이터 작업을 쉽고 직관적으로 할 수 있도록 빠르고 유연한 데이터 구조를 제공하는 모듈
1) 모듈 불러오기 + 별칭
import pandas as pd
2) Series와 DataFrame
- 1차원, 1개의 column은 Series라고 합니다.
- 데이터프레임: 가로축, 세로축이 있는 2차원. 다양한 타입의 데이터를 저장하는 자료구조
- 기본적으로 Series를 만드는 방법 두 가지
pd.Series([1,2,3,4])
a = [1,2,3,4]
pd.Series(a)
- 데이터 프레임을 만드는 방법 - 첫 번째
# DataFrame 만들기 1
product1 = [['삼성',990000, '갤럭시22'],
['애플', 1300000, '맥북에어'],
['엘지', 1200000, '엘지그램']]
df1 = pd.DataFrame(product1) # df1에 저장
df1
out::::
데이터분석을 하다보면 컬럼명을 이용하는 경우가 많기 때문에 컬럼명을 변경해주겠습니다.
- 컬럼명 바꾸기
# 컬럼 제목 변경
df1.columns = ['회사명', '가격', '상품']
df1
out::::
- 데이터 프레임을 만드는 방법 - 두 번째(딕셔너리를 이용)
# DataFrame 만들기 2
product2 = {'회사명':['삼성','에플','엘지'],
'가격': [990000,1300000,1200000],
'상품':['갤럭시22','맥북에어','엘지그램']}
df2 = pd.DataFrame(product2)
df2
'회사명':['삼성','에플','엘지']
-> '회사명' 이라는 컬럼을 만들어서 ['삼성','에플','엘지'] 데이터를 넣음을 뜻합니다.
out::::
3) CSV 파일
- Comma Separated Value의 약자로써 쉼표로 구분된 파일
- 엑셀로 로딩할 수 있지만, 쉼표로 구분된 파일이 훨씬 가볍기 때문에 표준 csv을 많이 사용
- 공공데이터 포털에서도 csv 포멧의 파일을 많이 제공
- csv 파일 불러오기 - 방법1 (파일 경로로 불러오기)
# csv 파일 불러오기 방법1
pd.read_csv('C:/Users/****/Desktop/*****/******/*****/korean-idol.csv', sep=',')
# sep = ',' : ,(콤마)로 구분되어 있다
sep = ',' : 콤마로 구분되어 있어 있다고 알려주는 것입니다.
csv 파일은 엑셀 파일과 달리 가볍게 ,(콤마) 혹은 ' '(공백) 혹은 등등으로 구분되어 파일을 저장하고 있기 때문에 sep=''을 적어주는 것이 좋겠습니다. (물론 입력하지 않아도 파일을 불러올 수 있긴 합니다.)
- csv 파일 불러오기 - 방법1 (http 주소로 불러오기)
# csv 파일 불러오기 방법2
df = pd.read_csv('https://bit.ly/ds-korean-idol', sep=',') # df에 저장
- 컬럼 확인하기
df.columns
out::::
Index(['이름', '그룹', '소속사', '성별', '생년월일', '키', '혈액형', '브랜드평판지수'], dtype='object')
데이터분석 시 한글을 못 받아들이는 경우가 있을 수 있기 때문에 컬럼명을 영어로 변경해보겠습니다.
- 컬럼명 한번에 여러 개 변경하기
# 칼럼명 변경
new_column = ['name','group','company','gender','birthday','height','blood','brand']
df.columns = new_column
new_column이라는 리스트를 만들어 변경할 컬럼명을 입력해주고, df.columns에 리스트를 저장해주면 됩니다.
4) row(행)
- 행 정보 알아보기
df.index
out::::
RangeIndex(start=0, stop=15, step=1)
0행 부터 14행(15행전까지)까지 있음을 알 수 있습니다.
df.info() # 기본적인 행의 정보와 데이터타입을 알려줌
out::::
<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 group 14 non-null object
2 company 15 non-null object
3 gender 15 non-null object
4 birthday 15 non-null object
5 height 13 non-null float64
6 blood 15 non-null object
7 brand 15 non-null int64
dtypes: float64(1), int64(1), object(6)
memory usage: 1.1+ KB
5) 통계정보 알아보기
df.describe() # 정수 또는 실수 필드 데이터만 가져와서 통계 정보를 출력
out::::
6) 형태(shape) 알아보기
- shape는 tuple 형태로 변환되며, 첫번째는 row, 두번재는 column의 숫자를 의미
df.shape
out::::
(15, 8)
(행, 열)을 뜻합니다.
7) 원하는 개수의 데이터 보기
- head() : 상위 5개의 row를 출력
- head(5) : 상위 n개의 row를 출력
- tail() : 하위 5개의 row를 출력
- tail(n) : 하위 n개의 row를 출력
df.head() # 상위 5개의 row를 출력
df.head(3) # 상위 3개의 row를 출력
df.tail() # 하위 5개의 row를 출력
df.tail(3) # 하위 3개의 row를 출력
8) 정렬하기
- index 정렬
# index로 오름차순 정렬
df.sort_index()
# index로 내림차순 정렬
df.sort_index(ascending=False)
- 값 정렬
# 값에 따른 정렬
df.sort_values(by='height') # 오름차순
df.sort_values(by='height', ascending=False) # 내림차순
# NaN을 가장 위로
df.sort_values(by='height', ascending=False, na_position='first')
# 조건 2개로 정렬 (2차 정렬)
df.sort_values(by=['height','brand'], ascending=[False, False], na_position='first')
# height로 정렬을 하고 같은 경우에 그것들을 brand로 정렬
sort_values() 조건으로
* by='height' : height 컬럼으로 정렬
* ascending='False' :내림차순으로 정렬
* na_position='first' : NaN 값을 가장 위로 올린 후 정렬
9) 컬럼 다루기
- 컬럼에 들어있는 데이터 확인
df['name']
df.name
10) 범위선택(range selection) - loc[] & iloc[]
- loc[]
df.loc[:,'name'] # 행 전부, 열은 'name'만
loc[행, 열] 형식으로 입력하면 됩니다.
df.loc[:3,'name'] # 처음부터 3까지 가져옴
이렇게 입력하면 'name'열의 0행부터 3행까지의 행을 가져옵니다.
참고로, 0행부터 3행전까지가 아닌 0행부터 3행까지 가져오는 것을 알아둡시다.
- iloc[]
df.iloc[:,:3] # 행은 전부, 열은 3열 전까지
iloc[:, :3]은 행은 전부, 열은 3열 전까지 가져오게 됩니다.
참고로, loc[:, :3] 이었다면, 행은 전부, 열은 3열까지가 되겠습니다.
11) Boolean Indexing
- df[조건식] 을 사용하면 조건에 해당하는 데이터를 가져올 수 있겠습니다.
df[df['height'] >= 180]
해석을 해보면, df에서 df의 'height'가 180 이상인 데이터만 가져오고 싶다는 말이 되겠습니다.
- 원하는 행까지 있을 때의 코드는 다음과 같습니다.
df['name'][df['height'] >= 180]
해석을 해보면, df['name']에서 df의 'height'가 180 이상인 데이터만 가져오고 싶다는 말이 되겠습니다.
- 이제 위의 코드를 loc를 이용해서 작성해보겠습니다.
df.loc[df['height']>=180,'name']
loc[행, 열]인데 행 자리에 조건을 쓰면 된다는 것을 기억합시다.
즉, 행 자리에 우리가 위에서 쓴 조건식인 df['name'] >= 180 을 적으면 되고,
열 자리에는 우리가 'name' 행에서만 궁금한 것이니 위와 같이 코드를 작성하면 되겠습니다.
12) isin의 활용
- isin을 활용한 색인은 조건을 걸고자 하는 값이 정의한 list에 있을 때만 색인하려는 경우에 사용
company = ['apple', 'samsung']
df['company'].isin(company) # True는 apple 혹은 samsung
out::::
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: company, dtype: bool
- isin()을 이용해서 색인
# company 리스트 성분들이 포함된 행만 추출
df.loc[df['company'].isin(company)]
해석을 해보면, df의 'company' 컬럼에서 company 리스트에 있는 성분이 있는 모든 행 추출함을 의미합니다.
13) 결측값(Null)
- Null값은 비어있는 값 또는 결측값이라고 함
- pandas에서는 NaN(Not a Number)로 표기된 것은 결측값으로 취급
df.isna() # 결측값인지 여부를 판단
out::::
- 특정 컬럼에서 결측치가 있는 데이터 알아보기
# isnull()
df['name'][df['group'].isnull()]
# isna()
df['name'][df['group'].isna()]
즉, 'group' 컬럼에서 결측치가 있는 데이터의 이름을 알고싶다는 의미가 되겠습니다.
- 결측치가 아닌 값 알아보기 - notnull()
df['name'][df['group'].notnull()]
즉, 'group' 컬럼에서 결측치가 아닌 데이터의 이름을 알고싶다는 의미 입니다.
- loc를 이용
# 그룹이 있는 연예인의 이름, 키, 혈액형을 출력
df.loc[df['group'].notnull(), ['name','height','blood']]
loc[행, 열]에서 행 자리에는 조건을 쓸 수 있음을 기억해보면,
df의 'group' 컬럼에서 결측치가 아닌 데이터 중에서,
['name','height','blood'] 열을 추출하겠다는 의미가 되겠습니다.
13) 데이터 복사
- 잘못된 코드
new_df = df
new_df['name'] = '홍길동'
이렇게 되면, new_df에서 바꾼 데이터가 df에도 들어가게 됩니다.
원본 데이터와 따로 쓰려고 했던 의도와 달리 데이터가 망가지게 되겠죠?
이유는 같은 메모리를 참조하고 있기 때문입니다.
print(hex(id(new_df)))
print(hex(id(df)))
out::::
0x1bc69a2b5e0
0x1bc69a2b5e0
보시다시피, new_df와 df는 서로 같은 메모리를 참조하고 있습니다.
- 올바른 코드
copy_df = df.copy()
copy() 를 이용하면 됩니다.
print(hex(id(copy_df)))
print(hex(id(df)))
out::::
0x1bc6c01da90
0x1bc6c01d1f0
copy() 를 이용하면 서로 다른 메모리 주소를 갖는 것을 알 수 있습니다.
이러면 copy_df의 데이터를 변경해도 원본인 df는 변화가 없겠습니다.

다음 글에 이어서 기본적인 pandas 모듈을 더 알아보겠습니다 :)
'빅데이터 인공지능 > 데이터분석' 카테고리의 다른 글
[데이터분석] ⑥ 쇼핑몰 고객주문 데이터 프로젝트 실습 (0) | 2022.06.30 |
---|---|
[데이터분석] ⑤ matplotlib 라이브러리 (0) | 2022.06.28 |
[데이터분석] ④ 데이터 전처리 활용 및 수행 (0) | 2022.06.27 |
[데이터분석] ③ 기본적인 pandas 모듈(2) (0) | 2022.06.27 |
[데이터분석] ① 기본적인 numpy 모듈 (0) | 2022.06.23 |
- Total
- Today
- Yesterday
- rtl
- 인프런
- 리액트 훅
- next.js
- jest
- frontend
- CSS
- 타입스크립트
- Python
- styled-components
- 프론트엔드 기초
- 딥러닝
- react-query
- TypeScript
- 자바스크립트
- 프론트엔드
- HTML
- 스타일 컴포넌트 styled-components
- react
- testing
- 프로젝트 회고
- 프론트엔드 공부
- 파이썬
- 리액트
- 머신러닝
- 자바스크립트 기초
- 디프만
- JSP
- 데이터분석
- 자바
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |