티스토리 뷰
참고글
# 행/열 전치 (T 메서드)
fruits.T
0 1 2 3
name apple mango banana cherry
price 2000 150 500 400
qty 5 4 10 NaN
# 연산 (add, sub, div, mul 메서드)
# NA 처리 가능한 연산 메서드
df1 = DataFrame({'a':[1,2,3], 'b':[10,NA,20]})
a b
0 1 10.0
1 2 NaN
2 3 20.0
df2 = DataFrame({'b':[1,2,3], 'c':[10,NA,20]}, index = [0,1,3])
b c
0 1 10.0
1 2 NaN
3 3 20.0
df1 + df2 # 데이터 손실 발생
a b c
0 NaN 11.0 NaN
1 NaN NaN NaN
2 NaN NaN NaN
3 NaN NaN NaN
df1.add(df2, fill_value = 0) # 매칭되지 않는 키는 0으로 치환 (원본 데이터 손실 방지)
a b c
0 1.0 11.0 10.0
1 20. 20. NaN
2 3.0 20.0 NaN
3 NaN 3.0 20.0
df1 + df1.iloc[0]
df1.add(df1.iloc[:,0], axis=0) # 축 지정 가능
a b
0 2.0 11.0
1 4.0 NaN
2 6.0 23.0
# 정렬 (sort_index, sort_values 메서드)
1. sort_index() : row/column index 정렬
- 내림차순 사용 시, ascending = False 옵션
df1.sort_index?
df1.sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, by=None)
df1 = DataFrame({'c':[1,2,3], 'b':[10,NA,20], 'a':[3,6,9]},
index = [2,3,1])
c b a
2 1 10.0 3
3 2 NaN 6
1 3 20.0 9
df1.sort_index() # row index 정렬
c b a
1 3 20.0 9
2 1 10.0 3
3 2 NaN 6
df1.sort_index(axis=1) # column index 정렬
a b c
2 3 10.0 1
3 6 NaN 2
1 9 20.0 3
2. sort_values() : value 정렬
- 내림차순 사용 시, ascending = False 옵션
df1.sort_values?
df1.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')
df1.a.sort_values(ascending = False)
1 9
3 6
2 3
Name: a, dtype: int64
df1.sort_values(by='a', ascending = False) # by 기준 정렬
c b a
1 3 20.0 9
3 2 NaN 6
2 1 10.0 3
# 순위 (rank 메서드)
data.rank?
data.rank(axis=0, method='average', numeric_only=None, na_option='keep', ascending=True, pct=False)
s1 = Series([1,1,3,5,5,7,9,9])
s1.rank() # 동률 발생 시 평균 순위(default method : average)
0 1.0
1 2.0
2 3.5
3 3.5
4 5.0
5 6.5
6 6.5
dtype: float64
s1.rank(method='min') # 동률 발생 시 최소 순위
0 1.0
1 2.0
2 3.0
3 3.0
4 5.0
5 6.0
6 6.0
dtype: float64
s1.rank(method='max') # 동률 발생 시 최대 순위
0 1.0
1 2.0
2 4.0
3 4.0
4 5.0
5 7.0
6 7.0
dtype: float64
s1.rank(method='first') # 동률 발생 시 먼저 관측된 데이터에 높은 순위
0 1.0
1 2.0
2 3.0
3 4.0
4 5.0
5 6.0
6 7.0
dtype: float64
# 데이터 중복 (unique, value_counts 메서드)
s1 = Series([1,1,2,3,3,4,5,6,6])
s1.unique() # 중복 데이터 제거
array([1, 2, 3, 4, 5, 6], dtype=int64)
s1.value_counts() # 데이터가 몇 회 반복되었는지 확인
6 2
3 2
1 2
5 1
4 1
2 1
dtype: int64
# 특정 데이터 일치 or 포함 여부 확인 (isin, in 메서드)
1. 특정 데이터 일치 여부 확인 .isin() 메서드
# isin 메서드는 DataFrame 적용과 벡터연산이 가능
df2 = DataFrame({'col1':['a','b','c','d'], 'col2':['c','e','b','a']})
df2.isin(['a','b'])
df2.isin({'col1':['a','b'], 'col2':['b','c']} # 컬럼별 확인 가능
df2[df2['col1'].isin(['a','b'])] # col1 컬럼에서 a or b와 일치하는 행 색인
2. 특정 데이터 포함 여부 확인 in 연산자
# in 연산자는 DataFrame 적용과 벡터(반복) 연산이 불가능하므로, 함수 생성 후 map에 적용해야 함
df2 = DataFrame({'col1':['a123','b138','a156','d175'], 'col2':['c456','e456','b456','a456']})
df2['col1'].map(lambda x: 'a' in x)
0 True
1 False
2 True
3 False
Name: col1, dtype: bool
df2[df2['col1'].map(lambda x: 'a' in x)] # col1 컬럼에서 a를 포함하는 행 색인
# 산술통계 메서드
df1 = DataFrame({'a':[1,3,np.nan,5,7,2,4,np.nan,6,8],
'b':[132,264,835,813,248,92,153,386,81,538]})
# .count() : NA 값을 제외한 데이터 수 확인
df1.count()
a 8
b 10
dtype: int64
# .describe() : 각 열에 대한 요약 통계
df1.describe()
# .min(), .max() : 최소, 최대값
df1.min()
a 1.0
b 81.0
dtype: float64
df1.max()
a 8.0
b 835.0
dtype: float64
# .argmin(), .argmax() : 최소, 최대값을 가지고 있는 인덱스 위치 확인
df1.a.argmin()
0
df1.a.argmax()
9
# .idxmin(), .idxmax() : 최소, 최대값을 가지고 있는 인덱스 값 확인
df1.a.idxmin()
0
df1.a.idxmax()
9
# .quantile() : 0 ~ 1까지의 분위수 계산
df1.quantile()
a 4.5
b 256.0
Name: 0.5, dtype: float64
# .sum(), .mean() : 합, 평균
df1.sum()
a 36.0
b 3542.0
dtype: float64
df1.mean()
a 4.5
b 354.2
dtype: float64
# .median() : 중위값
df1.median()
a 4.5
b 256.0
dtype: float64
# .mad() : 평균값에서 절대 평균편차
a 2.00
b 231.04
dtype: float64
# .var() : 표본 분산
df1.var()
a 6.000000
b 81012.844444
dtype: float64
# .std() : 표본 정규분산
df1.std()
a 2.449490
b 284.627554
dtype: float64
# .skew() : 표본 비대칭도
df1.skew()
a 0.0000
b 0.9306
dtype: float64
# .kurt() : 표본 첨도
df1.kurt()
a -1.200000
b -0.566279
dtype: float64
# .cumsum() : 누적합
df1.cumsum()
# .corr : 상관관계 확인
df2 = DataFrame({'a':[1,3,5,7,13],
'b':[132,264,364,427,577]})
df2.corr()
# 두 변수의 상관관계가 절대값 1에 가까우므로 상관관계가 높다는 것을 알 수 있음
두 변수의 상관관계의 절대값이 0에 가까우면 상관관계가 없다고 해석할 수 있음
위 데이터는 '실제 변수 a가 증가할 수록 변수 b도 증가하고 있음'
# .cov : 공분산 확인
df2.cov()
# 다중공선성의 문제를 확인할 때 사용
#. Q1
import pandas as pd
import numpy as np
from pandas import Series, DataFrame
from numpy import nan as NA
### disease.txt 파일을 불러들여 다음을 수행
data = pd.read_csv("disease.txt", encoding='cp949', sep='\s+')
# sep = '\s+' : (구분기호)하나 이상의 공백을 나타내는 정규표현식
data.dtypes
월별 object
콜레라 float64
장티푸스 float64
이질 object
대장균 float64
A형간염 object
dtype: object
data
data = data.set_index('월별') # 월별 컬럼을 row name으로 설정
# data.index = data['월별']
# data = data.drop('월별', axis = 1)
data.columns.name = '병명'
data = data.fillna(0) # NA값을 0으로 치환
f1 = lambda x : int(float(str(x).replace(',',''))) # 천 단위 구분기호 치환
data = data.applymap(f1)
data
# 1) 대장균이 가장 많이 발병한 달을 출력
data['대장균'].idxmax()
'7월'
# 2) 데이터를 A형간염이 많은 순으로 정렬
data.sort_values(by='A형간염', ascending = False)
# 3) 콜레라 기준으로 순위 출력
data['콜레라'].rank() # data.rank()['콜레라']
월별
1월 11.0
2월 10.0
3월 3.5
4월 3.5
5월 3.5
6월 7.0
7월 12.0
8월 1.0
9월 7.0
10월 3.5
11월 7.0
12월 9.0
Name: 콜레라, dtype: float64
# 4) 각 질병 별 발병횟수의 총 합을 출력
data.apply(sum, axis=0) # data.sum(axis=0) : NA값이 있는 경우, NA를 무시하고 계산
병명
콜레라 42
장티푸스 1828
이질 4199
대장균 593
A형간염 6551
dtype: int64
#. Q2
### orcale에 저장된 student.csv 파일을 불러들인 후
import cx_Oracle
import os
os.putenv('NLS_LANG', 'KOREAN_KOREA.KO16MSWIN949')
con1 = cx_Oracle.connect("scott/oracle@192.168.0.91:1521/orcl")
std = pd.read_sql("select * from student",con=con1)
std.head()
# 1) 각 학년별 평균키가 출력되도록 사용자 정의함수 생성, 적용, 새로운 컬럼 생성
f2 = lambda x : std.loc[std.GRADE == x, 'HEIGHT'].mean()
std['HEIGHT_M'] = std.GRADE.map(f2)
# 2) 성별컬럼 생성
f3 = lambda x : np.where(str(x)[6] == '1', '남','여') # f3 = lambda x : '남' if str(x)[6] == '1' else '여'
std['GENDER'] = std.JUMIN.map(f3)
# 3) 지역번호 컬럼 생성
f4 = lambda x : x.split(')')[0] # f4 = lambda x : x[0:x.find(')')]
area = std.TEL.map(f4)
std['AREA'] = area
std
# 4) id에 'a'가 포함된 학생의 정보 출력
f5 = lambda x : 'a' in x
std[std.ID.map(f5)]
#. Q3
# emp_1.csv 데이터 로딩 후
emp1 = pd.read_csv('emp_1.csv', encoding = 'cp949')
emp1['SAL'] = emp1['SAL'].map(lambda x : int(x.replace('"' , '')))
1) job이 analyst인 사원들의 평균연봉을 구하여라.
emp1.loc[emp1['JOB'] == 'ANALYST' , 'SAL'].mean()
3000.0
2) 내년 임금은 현재 sal의 10% 증가값에 comm을 더한 값으로 산정, new_sal이라는 컬럼에 저장
emp1['NEW_SAL'] = (emp1['SAL'] * 1.1).add(emp1['COMM'] , fill_value = 0)
3) row이름은 각 사원의 사원번호로 설정
emp1 = emp1.set_index('EMPNO')
4) 컬럼 이름순으로(오름차순) 컬럼 재배치
참고: KIC 캠퍼스 머신러닝기반의 빅데이터분석 양성과정
'Python > Process' 카테고리의 다른 글
[Python] 데이터 병합(Join) - pandas.merge (0) | 2019.02.14 |
---|---|
[Python] DataFrame의 멀티인덱스와 멀티컬럼(Multi-index, Multi-column) (8) | 2019.02.12 |
[Python] DataFrame 그룹 함수 적용 - map,apply,applymap (0) | 2019.02.10 |
[Python] Pandas - DataFrame (0) | 2019.02.08 |
[Python] profile 만들기 (import를 한 번에) (0) | 2019.02.07 |