본문 바로가기

PYTHON

Pandas

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