티스토리 뷰

반응형




# 행/열 전치 (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 캠퍼스 머신러닝기반의 빅데이터분석 양성과정

반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday