Pandas
Numpy 기반으로 개발된 데이터 분석도구이며,
pandas는 주로 Series보다 DataFrame을 많이 쓴다.
리스트 형식으로 생성할 수도 있지만 dictionary로부터 생성할 수도 있다.
import pandas as pd
# pandas.Series는 1차원 데이터를 다루는 데 효과적이다.
print(pd.Series([1,2,3,4]))
# 0 1
# 1 2
# 2 3
# 3 4
# dtype: int64
# pandas.DataFrame은 2차원 데이터를 다루는데 유용하다.
# 리스트 형식
print(pd.DataFrame([[1,2,3,4],[5,6,7,8]], columns=['co1','co2','co3','co4']))
# co1 co2 co3 co4
# 0 1 2 3 4
# 1 5 6 7 8
# dictionary 형식
print(pd.DataFrame({'col1':[1,2,3,4],'col2':[5,6,7,8]}))
# col1 col2
# 0 1 5
# 1 2 6
# 2 3 7
# 3 4 8
# DataFrame
# .values 속성을 이용해 데이터만 numpy array 형식으로 접근 가능하다.
print(pd.DataFrame({'col1':[1,2,3,4],'col2':[5,6,7,8]}).values)
# [[1 5]
# [2 6]
# [3 7]
# [4 8]]
# Column의 이름은 .columns를 통해 얻을 수 있다.
print(pd.DataFrame({'col1':[1,2,3,4],'col2':[5,6,7,8]}).columns)
# Index(['col1', 'col2'], dtype='object')
# Row의 이름은 .index를 통해 얻을 수 있다.
print(pd.DataFrame({'col1':[1,2,3,4],'col2':[5,6,7,8]}).index)
# RangeIndex(start=0, stop=4, step=1)
# DataFrame의 열,행 선택
# df['컬럼이름'] 또는 df.컬럼이름을 통해 열 하나에 접근 가능하다.
# df[['컬럼이름1','컬럼이름2']]를 통해 여러 개의 컬럼에 접근 가능하다.
a = pd.DataFrame({'col1':[1,2,3,4],'col2':[5,6,7,8]})
print(a['col1'])
# 0 1
# 1 2
# 2 3
# 3 4
# Name: col1, dtype: int64
print(a.col1)
# 0 1
# 1 2
# 2 3
# 3 4
# Name: col1, dtype: int64
# df[숫자1:숫자2]를 통해 특정 행들에 접근 가능하다.
print(a[2:])
# col1 col2
# 2 3 7
# 3 4 8
print(a[0:2])
# col1 col2
# 0 1 5
# 1 2 6
# df.iloc[숫자]를 통해 특정 행 하나에 접근가능하다.(iloc도 마찬가지로 숫자1:숫자2로 여러 행에 접근가능)
print(a.iloc[0])
# col1 1
# col2 5
# Name: 0, dtype: int64
# DataFrame에 열 갱신, 추가, 삭제
# df['새로만들열이름'] = data 컬렉션 : dataframe에 새로운 열 추가
a['col3'] = [9,10,11,12]
print(a)
# col1 col2 col3
# 0 1 5 9
# 1 2 6 10
# 2 3 7 11
# 3 4 8 12
# df['기존열이름'] = df['기존열이름'] * 100 : dataframe의 기존열을 변경
a['col3'] = a['col3']*100
print(a)
# col1 col2 col3
# 0 1 5 900
# 1 2 6 1000
# 2 3 7 1100
# 3 4 8 1200
# del df['기존열이름'] : 기존 열의 삭제
del a['col3']
print(a)
# col1 col2
# 0 1 5
# 1 2 6
# 2 3 7
# 3 4 8
# DataFrame에 함수 적용
# df.apply(함수, axis = 0) : axis가 0일 경우(또는 생략) 컬럼 단위로 함수를 수행, axis가 1일 경우 row 단위로 함수 수행한다.
print(a.apply(sum))
# col1 10
# col2 26
# dtype: int64
print(a.apply(sum, axis=1))
# 0 6
# 1 8
# 2 10
# 3 12
# dtype: int64
# df.applymap(함수) : 각각 요소별로 함수 적용
print(a.applymap(lambda x : x**3))
# col1 col2
# 0 1 125
# 1 8 216
# 2 27 343
# 3 64 512
# df.applymap(함수)처럼 사용 가능
print(a.apply(lambda x : x[0]*x[1], axis=1))
# 0 5
# 1 12
# 2 21
# 3 32
# dtype: int64
# DataFrame에 NaN 처리
a = pd.DataFrame({'col1':[1,None,3,None],'col2':[None,6,7,8]})
print(a)
# col1 col2
# 0 1.0 NaN
# 1 NaN 6.0
# 2 3.0 7.0
# 3 NaN 8.0
# isnull(): NaN이나 None인 경우 True, 그 외엔 False
print(pd.isnull(a))
# col1 col2
# 0 False True
# 1 True False
# 2 False False
# 3 True False
# notnull(): isnull의 반대
print(pd.notnull(a))
# col1 col2
# 0 True False
# 1 False True
# 2 True True
# 3 False True
# dropna(): NaN이나 None을 소유한 행을 제외
print(a.dropna())
# col1 col2
# 2 3.0 7.0
# fillna(): NaN이나 None을 특정 수로 채울 수 있다. # NaN는 정수가 없기 때문에 실수로 바뀔 수 있다.
print(a.fillna(3))
# col1 col2
# 0 1.0 3.0
# 1 3.0 6.0
# 2 3.0 7.0 # NaN이 없었어도 실수로 바뀌었다.
# 3 3.0 8.0
# DataFrame에 groupby
# DataFrame으로 작업할 때, 그룹별로 통계 분석을 할 경우가 많다.
# 이럴 때 사용하는 것이 바로 groupby 메서드이다.
# 반 점수
# A학생 기린반 50
# B학생 기린반 30
# C학생 사슴반 20
# D학생 사슴반 70
a = pd.DataFrame([['기린반', 30], ['기린반', 50], ['사슴반', 40], ['사슴반', 80]], columns=['반', '점수'])
print(a)
# 반 점수
# 0 기린반 30
# 1 기린반 50
# 2 사슴반 40
# 3 사슴반 80
# df.groupby('반').mean() : 반별 평균 점수를 반환한다.
print(a.groupby('반').mean())
# 반
# 기린반 40.0
# 사슴반 60.0
# df.groupby('컬럼이름').agg(함수): 컬럼이름이 같은 것들끼리 함수를 적용 # .agg() : 지정하고 싶은 함수 적용
print(a.groupby('반').agg(lambda x : sum(x)**2))
# 반
# 기린반 6400
# 사슴반 14400
# 하드디스크에 내용 저장하기
print(a.to_csv('C:\\Users\\USER\\test.csv', index=False))
print(pd.read_csv('C:\\Users\\USER\\test.csv'))
# 반 점수
# 0 기린반 30
# 1 기린반 50
# 2 사슴반 40
# 3 사슴반 80
'PYTHON' 카테고리의 다른 글
Rest API, Flask, python 속도 향상법 (2) | 2023.01.29 |
---|---|
Numpy (0) | 2023.01.27 |
DB 연동과 정규식 (0) | 2023.01.24 |
병렬처리(프로세스와 쓰레드), Process와 Pool의 차이 (0) | 2023.01.24 |
추상 클래스, isinstance, assert 문, __call__, 파일처리, with ~ as 문, 직렬화, 디렉토리(폴더) 생성 (0) | 2023.01.24 |