"""
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())
일반
학번 성적
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('---------------------------')
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('---------------------------')
print(frame.drop(['성적'], axis = 1))
print('---------------------------')
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('---------------------------')
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('---------------------------')
print(frame.isna())
print('---------------------------')
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