티스토리 뷰

이전에 공부했던 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::::

(column을 잘 봐주세요)

데이터분석을 하다보면 컬럼명을 이용하는 경우가 많기 때문에 컬럼명을 변경해주겠습니다.

  • 컬럼명 바꾸기
# 컬럼 제목 변경
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 파일을 우클릭하고 '경로로 복사'를 누르시면 편하게 파일경로를 입력하실 수 있습니다.

  • 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 모듈을 더 알아보겠습니다 :)

728x90
LIST
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함