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')
실습을 위해 파일을 읽어온다.
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' )
'실습 > 파이썬 데이터 분석 및 시각화' 카테고리의 다른 글
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 |