[Python] Pandas 예제

JunMyung Lee·2022년 5월 21일
1

파이썬

목록 보기
2/4
"""
Pandas
데이터 조작을 용이하게 하기 위해 다차원 배열에 인덱스를 지정한 자료구조를 정의하고 정렬, 변환, 삭제 등을 할 수 있는 메서드를 제공

Series - 1차원 데이터 구조 ( 하나의 Row )
DataFrame - 2차원 데이터 구조 ( 여러개의 시리즈가 모여서 생성 )
"""
import pandas as pd
"""
데이터 프레임 샘플
"""
data = {
    '학번' : range(2000, 2010)
    , '성적' : [85, 95, 75, 70, 100, 100, 95, 85, 80, 85]
}
print('일반')
print(pd.DataFrame(data))
print('----------------------------')
print('프레임 컬럼 순서 변경')
print(pd.DataFrame(data, columns = ['성적', '학번']))
print('----------------------------')
print('프레임 인덱스 나열 변경')
print(pd.DataFrame(data, columns = ['성적', '학번'], index = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']))
print('행렬 변환')
print(pd.DataFrame(data, columns = ['성적', '학번'], index = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']).transpose()) # or .T
일반
     학번   성적
0  2000   85
1  2001   95
2  2002   75
3  2003   70
4  2004  100
5  2005  100
6  2006   95
7  2007   85
8  2008   80
9  2009   85
----------------------------
프레임 컬럼 순서 변경
    성적    학번
0   85  2000
1   95  2001
2   75  2002
3   70  2003
4  100  2004
5  100  2005
6   95  2006
7   85  2007
8   80  2008
9   85  2009
----------------------------
프레임 인덱스 나열 변경
    성적    학번
a   85  2000
b   95  2001
c   75  2002
d   70  2003
e  100  2004
f  100  2005
g   95  2006
h   85  2007
i   80  2008
j   85  2009
행렬 변환
       a     b     c     d     e     f     g     h     i     j
성적    85    95    75    70   100   100    95    85    80    85
학번  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009
"""
데이터 통계
"""
data = {
    '학번' : range(2000, 2010)
    , '성적' : [85, 95, 75, 70, 100, 100, 95, 85, 80, 85]
}

# 주요 통계 지표
frame = pd.DataFrame(data)
print(frame.describe())
print('---------------------------')
# 데이터 구조
print(frame.info())
print('---------------------------')
# 중복 제거
print(frame['성적'].unique())
print('---------------------------')
# Group by
print(frame['성적'].value_counts())
               학번          성적
count    10.00000   10.000000
mean   2004.50000   87.000000
std       3.02765   10.327956
min    2000.00000   70.000000
25%    2002.25000   81.250000
50%    2004.50000   85.000000
75%    2006.75000   95.000000
max    2009.00000  100.000000
---------------------------
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   학번      10 non-null     int64
 1   성적      10 non-null     int64
dtypes: int64(2)
memory usage: 288.0 bytes
None
---------------------------
[ 85  95  75  70 100  80]
---------------------------
85     3
95     2
100    2
75     1
70     1
80     1
Name: 성적, dtype: int64
"""
데이터 정렬
"""

data = {
    '학번' : range(2000, 2010)
    , '성적' : [85, 95, 75, 70, 100, 100, 95, 85, 80, 85]
}

frame = pd.DataFrame(data)
print(frame.sort_values(by = ['성적'], ascending = True))
print('---------------------------')
# 인덱스 선택
print(frame.sort_values(by = ['성적'], ascending = True).iloc[2])
print('---------------------------')
# 조건에 따른 필터
print(frame[frame['성적'] > 80])
print('---------------------------')
# 필터의 유니크 체이닝
print(frame[frame['성적'] > 80]['성적'].unique())
print('---------------------------')
# 최대값, 평균값
print(frame['성적'].max())
print(frame['성적'].argmax())
print('---------------------------')
# 삭제 - 로우인 경우 기본설정
print(frame.drop(0))
print('---------------------------')
# 삭제 - 컬럼명인 경우 axis = 1 필요
print(frame.drop(['성적'], axis = 1))
print('---------------------------')
# 삭제 - 완전삭제의 경우 inplace = True 필요
print(frame.drop(['성적'], axis = 1, inplace = True))
     학번   성적
3  2003   70
2  2002   75
8  2008   80
0  2000   85
7  2007   85
9  2009   85
1  2001   95
6  2006   95
4  2004  100
5  2005  100
---------------------------
학번    2008
성적      80
Name: 8, dtype: int64
---------------------------
     학번   성적
0  2000   85
1  2001   95
4  2004  100
5  2005  100
6  2006   95
7  2007   85
9  2009   85
---------------------------
[ 85  95 100]
---------------------------
100
4
---------------------------
     학번   성적
1  2001   95
2  2002   75
3  2003   70
4  2004  100
5  2005  100
6  2006   95
7  2007   85
8  2008   80
9  2009   85
---------------------------
     학번
0  2000
1  2001
2  2002
3  2003
4  2004
5  2005
6  2006
7  2007
8  2008
9  2009
---------------------------
None
"""
데이터 연산
"""
data = {
    '학번' : range(2000, 2010)
    , '성적' : [85, 95, 75, 70, 100, 100, 95, 85, 80, 85]
}
frame = pd.DataFrame(data)
# 산술 연산
print(frame['성적'] + 4)
print('---------------------------')
# 산술 연산 - 컬럼 생성
frame['합계'] = frame['학번'] + frame['성적']
print(frame)
frame['평균'] = frame['합계'].mean()
print(frame)
print('---------------------------')
0     89
1     99
2     79
3     74
4    104
5    104
6     99
7     89
8     84
9     89
Name: 성적, dtype: int64
---------------------------
     학번   성적    합계
0  2000   85  2085
1  2001   95  2096
2  2002   75  2077
3  2003   70  2073
4  2004  100  2104
5  2005  100  2105
6  2006   95  2101
7  2007   85  2092
8  2008   80  2088
9  2009   85  2094
     학번   성적    합계      평균
0  2000   85  2085  2091.5
1  2001   95  2096  2091.5
2  2002   75  2077  2091.5
3  2003   70  2073  2091.5
4  2004  100  2104  2091.5
5  2005  100  2105  2091.5
6  2006   95  2101  2091.5
7  2007   85  2092  2091.5
8  2008   80  2088  2091.5
9  2009   85  2094  2091.5
---------------------------
"""
데이터 샘플링
전체 데이터 중에서, 일부를 추출하는 것을 '샘플링'
고려 요소는 다음과 같다.

- 데이터의 복원요소
복원 추출법 > 추출한 데이터를 다시 모집단에 복원하여 추출하는 방법
비복원 추출법 > 추출한 데이터를 모집단에서 제외하는 방법
"""
data = {
    '학번' : range(2000, 2010)
    , '성적' : [85, 95, 75, 70, 100, 100, 95, 85, 80, 85]
}
frame = pd.DataFrame(data)

# 샘플링 - 전체 데이터중 일부 추출
print(frame.sample(n = 4))
print('---------------------------')
# 샘플링 - 전체 데이터중 일부 비율 추출 ( 10% )
# 복원 추출을 할 경우 ( frac 1이상 인경우 ) replace = True 추가
print(frame.sample(frac = 0.1))
print('---------------------------')
print(frame.sample(frac = 2, replace = True))
# 샘플링 - 가중치 부여 ( 성적이 높은 로우가 비교적 샘플링 대상 )
print(frame.sample(frac = 0.2, weights = '성적')) 
print('---------------------------')
# 샘플링 - 열기준 추출
print(frame.sample(n = 1, axis = 1))
     학번   성적
6  2006   95
8  2008   80
4  2004  100
5  2005  100
---------------------------
     학번   성적
5  2005  100
---------------------------
     학번   성적
7  2007   85
3  2003   70
8  2008   80
2  2002   75
7  2007   85
4  2004  100
2  2002   75
0  2000   85
6  2006   95
4  2004  100
3  2003   70
5  2005  100
7  2007   85
4  2004  100
8  2008   80
1  2001   95
5  2005  100
8  2008   80
4  2004  100
9  2009   85
     학번  성적
9  2009  85
1  2001  95
---------------------------
     학번
0  2000
1  2001
2  2002
3  2003
4  2004
5  2005
6  2006
7  2007
8  2008
9  2009
"""
데이터 함수 적용
apply 메소드에 함수 명칭을 넣어서 처리
Java의 Functional과 비슷
"""
data = {
    '학번' : range(2000, 2010)
    , '성적' : [85, 95, 75, 70, 100, 100, 95, 85, 80, 85]
}
frame = pd.DataFrame(data)

def getSquareRoot(data):
    return data * data

print(frame['성적'].apply(getSquareRoot))
print('---------------------------')
# 람다
print(frame['성적'].apply(lambda data: data + 1))
print('---------------------------')
# 람다 별수 
lambda_variable = lambda data: data + 2
print(frame['성적'].apply(lambda_variable))
0     7225
1     9025
2     5625
3     4900
4    10000
5    10000
6     9025
7     7225
8     6400
9     7225
Name: 성적, dtype: int64
---------------------------
0     86
1     96
2     76
3     71
4    101
5    101
6     96
7     86
8     81
9     86
Name: 성적, dtype: int64
---------------------------
0     87
1     97
2     77
3     72
4    102
5    102
6     97
7     87
8     82
9     87
Name: 성적, dtype: int64
"""
원핫인코딩
prefix에 설정된 문자열을 제외한 숫자형태의 값을 숫자형으로 변경 이후,
새로이 통계 데이터를 생성
"""
data = {
   '노선' : ['1호선', '2호선', '5호선', '1호선', '1호선', '5호선', '2호선']
}
frame = pd.DataFrame(data)
print(pd.get_dummies(frame['노선'], prefix = '노선'))
   노선_1호선  노선_2호선  노선_5호선
0       1       0       0
1       0       1       0
2       0       0       1
3       1       0       0
4       1       0       0
5       0       0       1
6       0       1       0
"""
결측치 처리
데이터 프레임에 NaN(=Null)이 포함되어 있을 경우, 제대로 원하는 결과가 안나올수 있다.
이에 따른 결측치에 대한 전처리가 필요하다.

- isna()        : 데이터프레임에 결측치가 포함되어 있을 경우 True, 아니면 False 반환
- fillna(value) : 결측치를 지정한 값으로 치환
- dropna()      : 결측치 로우 삭제
"""

data = {
    '학번' : range(2000, 2010)
    , '성적' : [85, None, 75, 70, None, 100, None, 85, 80, 85]
}
frame = pd.DataFrame(data)
print(frame)
print('---------------------------')
# None 데이터 체크
print(frame.isna())
print('---------------------------')
# None 데이터 개수
print(frame.isna().sum())
print('---------------------------')
# 결측치 데이터 치환
print(frame.fillna(0))
# 결측치 데이터 치환 반영 안되어 있음
print(frame)
# 결측치 데이터 치환 실 반영
frame['성적'].fillna(0, inplace = True)
# 결측치 데이터 치환 반영 되어 있음
print(frame)
     학번     성적
0  2000   85.0
1  2001    NaN
2  2002   75.0
3  2003   70.0
4  2004    NaN
5  2005  100.0
6  2006    NaN
7  2007   85.0
8  2008   80.0
9  2009   85.0
---------------------------
      학번     성적
0  False  False
1  False   True
2  False  False
3  False  False
4  False   True
5  False  False
6  False   True
7  False  False
8  False  False
9  False  False
---------------------------
학번    0
성적    3
dtype: int64
---------------------------
     학번     성적
0  2000   85.0
1  2001    0.0
2  2002   75.0
3  2003   70.0
4  2004    0.0
5  2005  100.0
6  2006    0.0
7  2007   85.0
8  2008   80.0
9  2009   85.0
     학번     성적
0  2000   85.0
1  2001    NaN
2  2002   75.0
3  2003   70.0
4  2004    NaN
5  2005  100.0
6  2006    NaN
7  2007   85.0
8  2008   80.0
9  2009   85.0
     학번     성적
0  2000   85.0
1  2001    0.0
2  2002   75.0
3  2003   70.0
4  2004    0.0
5  2005  100.0
6  2006    0.0
7  2007   85.0
8  2008   80.0
9  2009   85.0

0개의 댓글