본문 바로가기
실습/파이썬 데이터 분석 및 시각화

Pandas 사용법

by 이민우 2021. 11. 17.
728x90
반응형

Pandas

 

판다스는 데이터 조작, 처리 및 분석을 위한 파이썬 라이브러리로, 

행과 열로 이루어진 테이블 데이터, 즉 정형 데이터에 대한 처리가 특화된 라이브러리이다.

 

Pandas는 DataFrame 구조를 기반으로 만들어졌는데, 이는 테이블 형태와 유사하기에 엑셀 데이터와 연동이 좋다. 그렇기에 SQL, 엑셀, CSV 파일 등 다양한 소스에서 데이터를 읽기 쉽다.

 

Pandas는 테이블을 수정하고 조작하는 다양한 기능을 제공한다. Numpy와의 큰 차이점으로, Numpy는 배열 내 모든 원소의 타입이 동일해야 하는 반면에 Pandas는 각 원소의 타입이 달라도 상관이 없다.

 

import pandas as pd

 

 

판다스의 데이터 유형은 크게 두 가지인데,

하나는 Series, 다른 하나는 Data Frame이다.

  • Series : 컬럼이 하나만 있는 표. [ index : value ] 로 구성된다.
  • DataFrame : 컬럼이 두 개 이상인 표

 

Series

Series는 컬럼이 하나 뿐인 표이다.

기본적으로는 아래처럼 사용된다.

 

이 때 0부터 인덱스가 자동으로 생성되었는데,

인덱스는 아래의 방법으로 쉽게 지정할 수 있다.

import pandas as pd

#인덱스 지정 1번 방법
ser = pd.Series(['a', 'b', 'c'], index = ['index1', 'index2', 'index3'])

#인덱스 지정 2번 방법
ser = pd.Series({'index1' : 'a', 'index2' : 'b', 'index3' : 'c'})

 

리스트와 비슷한 형태이니만큼 리스트처럼 사용이 가능하다.

serTest1 = pd.Series([1, 2, 3, 4, 5])
serTest2 = pd.Series([2, 3, 4, 5, 6])
serTest3 = pd.Series([1, 2, 3, 4, 5],
                     index=['index1', 'index2', 'index3', 'index4', 'index5'])

print(serTest1[0] + serTest2[1]) # 1 + 3 = 4
print(serTest1[0] - serTest2[1]) # 1 - 3 = -2
print(serTest3['index1'] - serTest1[2]) # 1 - 3 = -2

 

만약 인덱스 혹은 값만 확인하고 싶다면 아래와 같이 활용할 수 있다.

print(serTest3.index) #Index(['index1', 'index2', 'index3', 'index4', 'index5'], dtype='object')
print(serTest3.values) #[1 2 3 4 5]

 

 

 

DataFrame

 

컬럼이 하나 뿐인 Series와 달리, DataFrame은 컬럼이 두 개 이상인 데이터이다.

기본적으로는 아래처럼 사용된다.

 

컬럼이 여러개이기 때문에 loc 변수를 사용해 특정 컬럼을 추출할 수 있다.

df.loc[0]
'''
인덱스    index1
이름          A
ID        AAA
나이         20
Name: 0, dtype: object
'''

 

원한다면 조건식을 이용한 검색도 가능하다.

df2 = df.loc[ df['나이'] < 30 ]

df2
'''
인덱스	이름	ID	나이
0	index1	A	AAA	20
1	index2	B	BBB	21
'''

 

특성 행 혹은 열을 삭제하고 싶은 경우 drop 명령어를 사용한다.

마찬가지로 조건식도 사용할 수 있다.

 

 

 

 

Pandas를 활용한 csv 파일 다루기

 

데이터는 다음의 [이름-나이-생월] CSV를 만들어서 사용한다.

데이터 제작 코드는 다음과 같다.

import pandas as pd
import random

name_arr = ['B','C','D','E','F','G','H','I','J',
            'K','L','M','N','O','P','Q','R','S',
            'T','U','V','W','X','Y','Z']
df = pd.DataFrame([{
                  'name' : 'A',
                  'age' : random.randrange(0, 60),  #1~59세
                  'month' : random.randrange(1, 13) #1~12월
                  }]);
                  
for i in range(24) :
  df = df.append([{'name' : name_arr[i],
                   'age' : random.randrange(0, 60),
                   'month' : random.randrange(1, 13)
                  }])

#저장
df.to_csv('/tmp/practice.csv')

 

practice.csv
0.00MB

 

 

 

 

실습을 위해 파일을 읽어온다.

import pandas as pd
import random

#불러오기
df = pd.read_csv('/tmp/practice.csv', encoding='UTF-8')

*기타 엑셀 파일은 read_excel 명령어로 불러올 수 있다.

*만약 파일에 한글이 포함되어 있다면 encoding에 유의하자.

 

샘플 데이터는 당연히 데이터 수가 많지 않지만,

실제 데이터는 데이터가 너무 많다면 일부 필요한 행 혹은 열만 불러와야 할 필요가 있다.

이 때 특정 행만, 특정 열만 불러오는 방법은 아래와 같다.

 

 

1) 특정 행 이후로 불러오기

pd.read_csv('/tmp/practice.csv', encoding='UTF-8', header=5) #5행 이후로만 불러오기

 

2) 특정 열만 불러오기

pd.read_csv('/tmp/practice.csv', usecols=['age','month']) #age, month 열만 불러오기

*parse_cols는 더 이상 지원되지 않는다.

 

 

이제 데이터를 불러왔다면, 데이터를 다루는 방법은 아래와 같다.

 

1) 컬럼명 바꾸기

df.rename(columns = {'age' : '나이', 'month' : '생월'}, inplace=True)

 

2) 정렬

df.sort_values(by='나이', ascending=True) #오름차순

*내림차순일 경우 ascending=False

 

3) 컬럼 추가

df['추가 칼럼'] = 0

 

4) 데이터 프레임 합치기 (열)

import pandas as pd
import random

#불러오기
except_name_df = pd.read_csv('/tmp/practice.csv', encoding='UTF-8', usecols=['age', 'month'])
name_df = pd.read_csv('/tmp/practice.csv', encoding='UTF-8', usecols=['name'])

concat_df = pd.concat([except_name_df, name_df], axis=1)

 

5) 데이터 프레임 합치기 (행)

import pandas as pd
import random

#불러오기
df1 = pd.read_csv('/tmp/practice.csv', encoding='UTF-8', usecols=['age', 'month']).tail(10)
df2 = pd.read_csv('/tmp/practice.csv', encoding='UTF-8', usecols=['age', 'month']).head(10)

df3 = df1.append(df2)

 

6) Join

import pandas as pd
import random

#불러오기
df1 = pd.read_csv('/tmp/practice.csv', encoding='UTF-8', usecols=['name', 'age']).tail(20)
df2 = pd.read_csv('/tmp/practice.csv', encoding='UTF-8', usecols=['name', 'month']).head(20)

#Inner Join
ij1 = pd.merge(df1, df2, on='name')
ij2 = pd.merge(df1, df2, on='name', how='inner')

#Left Outer Join
loj = pd.merge(df1, df2, on='name', how='left')

#Right Outer Join
roj = pd.merge(df1, df2, on='name', how='right')

#Full Outer Join
foj = pd.merge(df1, df2, on='name', how='outer')

 

 

판다스로 그래프 그리기

 

굳이 Matplotlib 등을 사용하지 않더라도 판다스 만으로 그래프를 그릴 수 있다.

데이터는 위에서 사용한 practice.csv 파일을 사용했다.

 

import pandas as pd
import random

#불러오기
df = pd.read_csv('/content/practice.csv', encoding='UTF-8')

 

 

막대 그래프

df_bar = df['age']

#막대 그래프
df_bar.plot.bar()

 

위의 예시는 하나의 데이터만을 사용했는데, 굳이 그러지 않고 여러 개의 데이터를 한 번에 표시할 수 있다.

df_bar = df[['age', 'month']]
df_bar.plot.bar()

 

또한 만약 bar가 아닌 barh를 사용하면 해당 막대 그래프가 가로로 출력된다.

df_bar = df[['age', 'month']]
df_bar.plot.barh()

 

 

꺾은선 그래프

df_plt = df['age']

#꺾은선 그래프
df_plt.plot()

 

 

히스토그램

#히스토그램
df_his = df['age']
df_his.plot.hist()

 

 

산점도

#산점도
df_sct = df[['age', 'month']]
df_sct.plot.scatter(x='age', y='month')

 

산점도 그래프는 위와 같은 방식 말고 아래와 같은 방식으로도 표현이 가능하다.

 

#이렇게도 표현 가능
df.plot(kind='scatter', 
        x='age', 
        y='month', 
        c='red', #색상
        s=100, #마커 크기
        marker='+' #마커 모양
        )

 

 

박스 그래프

#박스 그래프
df_box = df['age']
df_box.plot.box()

 

 

면적 그래프

#면적 그래프
df_area = df[['age', 'month']]
df_area.plot(kind = 'area')

 

면적 그래프는 기본적으로 데이터 위에 누적되어 보여지는데, 만약 이러한 방식이 싫다면 아래와 같이 겹치게 만들 수 있다.

#면적 그래프를 쌓아올리지 않고 겹치게 만드는 방법
df.plot(kind = 'area', 
        stacked=False, #겹치지 않게 설정
        alpha = 0.2 #뒤에 있는 그래프가 보이도록 투명도 설정
        )

 

 

원 그래프

#원 그래프
df_cir = df['month']
df_cir.plot(kind='pie' )
728x90
반응형

'실습 > 파이썬 데이터 분석 및 시각화' 카테고리의 다른 글

Nltk_영어 텍스트 분석  (0) 2021.11.18
Konlpy_한글 텍스트 분석  (0) 2021.11.18
Bokeh 패키지  (0) 2021.11.17
Seaborn 사용법  (0) 2021.11.17
Matplotlib 사용법  (0) 2021.11.17