사용안내 및 노트

홈으로/사용안내 및 노트
제목014. Python pandas 소개2020-09-13 18:41:25
작성자

☐ Python pandas 소개

 ○ pandas는 열(column)을 기준으로 하는 입력 데이터 분석용 API이다.

 ○ 주요 내용

  - DataFrame 및 Series에 대한 소개

  - DataFrame 및 Series에 대한 액세스 및 데이터 수정

  - DataFrame으로 CSV 데이터 가져 오기

  - DataFrame re-indexing을 통한 데이터 섞기

 ○ 기본 개념

  - pandas API를 가져와서 버전 출력하기

from __future__ import print_function

import pandas as pd

pd.__version__

  - pandas를 구성하는 두 개의 클래스 (객체를 정의해 놓은 설계도)

① Series: DataFrame을 구성하는 각 열(헤더 포함)

② DataFrame: 행과 열(헤더 포함)로 이루어진 관계형 데이터 테이블

   · DataFrame은 한 개 이상의 Series를 가진다.

  - Series 객체를 통한 Series 생성

pd.Series(['San Francisco', 'San Jose', 'Sacramento'])

  - DataFrame 객체를 통한 DataFrame 생성

   · dict 명(각 열의 헤더로 사용됨)으로 Series를 생성해서 DataFrame 객체에 전달

   · 퀴즈) 아래 코드에서 dict는? city_names, population

city_names = pd.Series(['San Francisco', 'San Jose', 'Sacramento'])

population = pd.Series([852469, 1015785, 485199])

pd.DataFrame({ 'City name': city_names, 'Population': population })

  - ML에서는 데이터 파일을 DataFrame으로 불러오는 방식을 주로 사용한다.

california_housing_dataframe = pd.read_csv("F:\AI\tmp\california_housing_train.csv", sep=",")

california_housing_dataframe.describe()

   · DataFrame.describe는 DataFrame에 대한 통계를 보여준다.

   · DataFrame.head는 상단 레코드 몇 개(기본은 5개)를 보여준다.

california_housing_dataframe.head()

   · DataFrame.hist는 특정 열의 분포를 그래프로 보여준다.

import matplotlib.pyplot as plt

california_housing_dataframe.hist('housing_median_age')

plt.show()

 ○ 데이터 액세스

  - dict/list operations을 이용해 데이터에 액세스를 한다.

cities = pd.DataFrame({ 'City name': city_names, 'Population': population })

print(type(cities['City name']))

cities['City name']

print(type(cities['City name'][1]))

cities['City name'][1]

print(type(cities[0:2]))

cities[0:2]

 ○ 데이터 수정

  - Series에 대하여 python이 지원하는 기본적인 연산을 수행할 수 있다.

population / 1000.

  - numpy는 과학적인 연산에 유용한 도구이다.

   · pandas Series는 대부분의 numpy 함수에 인수로 사용할 수 있다.

import numpy as np

np.log(population)

  - 더 복잡한 단일 열 변환에는 Series.apply를 사용할 수 있다. Python의 map 함수처럼 Series.apply는 lambda 함수를 인수로 사용할 수 있다.

   · lambda 함수는 함수 명을 정하지 않고 사용하기에 익명함수라고도 한다. 1회성 함수 구현 시 유용하다.

  - 아래에서는 인구가 백만 명을 초과하는지 나타내는 새 Series를 만든다.

population.apply(lambda val: val > 1000000)

  - DataFrames 수정은 직관적으로 수행할 수 있다.

  - 다음 코드는 DataFrame에 두 개의 Series를 추가한다.

cities['Area square miles'] = pd.Series([46.87, 176.53, 97.92])

cities['Population density'] = cities['Population'] / cities['Area square miles']

cities

 ○ indexes

  - Series와 DataFrame을 생성할 때 python은 Series의 각 항목과 DataFrame의 각 행에 index 속성을 할당한다. 이 값들은 향후 데이터의 순서가 바뀌더라도 변하지 않는다.

city_names.index

# RangeIndex(start=0, stop=3, step=1)

cities.index

# RangeIndex(start=0, stop=3, step=1)

  - DataFrame.reindex를 호출하여 수동으로 행의 순서를 다시 정렬한다. 아래는 city name을 기준으로 정렬시키는 것과 효과가 같다.

cities.reindex([2, 0, 1])

  - reindexing은 DataFrame을 임의로 섞기에 유용한 방법이다. 아래는 먼저 index를 numpy의 random.permutation 함수에 전달하여 섞은 후 reindex를 호출하면 DataFrame 행들도 같은 순서로 섞인다. 코드를 여러 번 실행해 결과를 확인한다.

cities.reindex(np.random.permutation(cities.index))

 ○ 참고사항

  - single quotes(‘)와 double quotes(“)는 차이가 없다.

  - 단일 column을 선택할 때, []은 Series를 반환하고 [[]]은 DataFrame을 반환한다. 따라서 두 개 이상의 columns을 선택할 때는 열 리스트이므로 [[]]을 사용해야 한다.

  - curly {} brackets:

   · dictionaries 또는 sets에 사용

  - square [] brackets:

   · lists (변경가능)에 사용: list = [ 1, 2, 3 ]

   · array indexing: ages[3] = 29

  - round () brackets:

   · tuples (변경 불가능)에 사용: retval = ( x, y, z )

   · operator precedence: result = (x + y) * z

   · class/function 정의 또는 호출: def func(x, y) or func(3,7)

type({})

# <class 'dict'>

type({1, 2})

# <class 'set'>

type([])

# <class 'list'>

type({1: 2})

# <class 'dict'>

type([1, 2])

# <class 'list'>

  - 함수(function)와 메서드(method)의 차이

   · 함수: function_name(input) 형태, 즉, print(), type() 등과 같음

   · 메소드: object.method_name( ) 형태, 즉, list.append(...), list.extend(...) 등과 같음

   · 메소드는 함수와 거의 유사하지만, 반드시 객체(object)와 함께 한다.

  - WARNING: The TensorFlow contrib module will not be included in TensorFlow 2.0.

   · tf.contrib.estimator.clip_gradients_by_norm는 다른 방식으로 구현되어야 한다.