지난번 포스팅에서는 Python pandas의 DataFrame 만들기, Attributes 조회하기에 대해서 알아보았습니다.

 

이번 포스팅에서는 DataFrame의 데이터를

 

 - (1) 행(row) 기준으로 선택해서 가져오기

 - (2) 열(column) 기준으로 선택해서 가져오기

 

방법(DataFrame objects indexing and selection by rows or columns)에 대해서 소개하겠습니다.

 

 

먼저, 필요한 Libraries 를 importing하고, 간단한 5행 3열의 DataFrame을 만들어 보겠습니다.

 

 

In [1]: import numpy as np

   ...: import pandas as pd

   ...: from pandas import DataFrame

   ...:

   ...: ##-- Making DataFrame

   ...: df_2 = DataFrame({'class_1': ['a', 'a', 'b', 'b', 'c'],

   ...:                          'var_1': np.arange(5),

   ...:                          'var_2': np.random.randn(5)},

   ...:                          index = ['r0', 'r1', 'r2', 'r3', 'r4'])

   ...:

   ...: df_2

Out[1]:

   class_1  var_1     var_2
r0       a      0  2.896618
r1       a      1 -0.113472
r2       b      2  0.261695
r3       b      3 -0.260788
r4       c      4 -0.791744

 

 

 

 

 

 (1) 행 기준으로 선택해서 가져오기 (indexing and selection by row)

 

DataFrame의 index 를 확인해보겠습니다.

 

 

In [2]: df_2.index # returning index

Out[2]: Index(['r0', 'r1', 'r2', 'r3', 'r4'], dtype='object')

 

 

 

'ix'를 사용하면 행 기준 indexing할 때 정수(int)와 행 이름(row label) 모두 사용할 수 있어서 편리합니다.

조건을 조금씩 달리해가면서 몇 가지 예를 아래에 들어보겠습니다. 서로 다른 점을 유심히 살펴보시면 어렵지 않게 사용법을 이해하실 수 있을 겁니다. 어렵지 않아요.

 

 

 

In [4]: df_2.ix[2:] # indexing from int. position to end

Out[4]:

   class_1  var_1     var_2
r2       b      2  0.261695
r3       b      3 -0.260788
r4       c      4 -0.791744

 

 

 

 

In [5]: df_2.ix[2] # indexing specific row with int. position

Out[5]:

class_1           b
var_1             2
var_2      0.261695
Name: r2, dtype: object

 

 

 

 

In [6]: df_2.ix['r2'] # indexing specific row with row label

Out[6]:

class_1           b
var_1             2
var_2      0.261695
Name: r2, dtype: object

 

 

 

 

데이터가 매우 많은 수의 행을 가지고 있을 경우에 위로 부터 n개의 행만 보고 싶은 때는 head(n) 메소드를 사용하면 됩니다.

 

 

In [7]: df_2.head(2) # Returns first n rows

Out[7]:

   class_1  var_1     var_2
r0       a      0  2.896618
r1       a      1 -0.113472

 

 

 

 

tail(n) 메소드는 행의 제일 마지막부터 n번째까지의 행 기준 데이터를 반환합니다.

 

 

In [8]: df_2.tail(2) # Returns last n rows

 

Out[8]:   

   class_1  var_1     var_2
r3       b      3 -0.260788
r4       c      4 -0.791744

 

 

 

 

 

 

 

  (2) 열 기준으로 선택해서 가져오기 (indexing and selection by column)

 

 

df_2 DataFrame의 열을 .columns 로 확인해 보겠습니다.

 

 

In [12]: df_2.columns
Out[12]: Index(['class_1', 'var_1', 'var_2'], dtype='object')

 

 

 

 

열(column) 기준으로 indexing할때는 '[ ]' 안에 열 이름(column label)을 'string' 형식으로 입력해주면 됩니다.

 

 

In [13]: df_2['class_1']

Out[13]:

r0    a
r1    a
r2    b
r3    b
r4    c
Name: class_1, dtype: object

 

 

 

 

두 개이상의 열(columns)을 가져오고 싶을 때는 튜플(tuple)을 사용해서 열의 이름을 나열해 주면 됩니다.

 

 

In [14]: df_2[['class_1', 'var_1']]

Out[14]:

   class_1  var_1
r0       a      0
r1       a      1
r2       b      2
r3       b      3
r4       c      4

 

 

 

이상으로 DataFrame Indexing and Selection에 대해서 마치겠습니다.

 

다음번 포스팅에서는 DataFrame index의 reindexing에 대해서 알아보겠습니다.

 

 

Posted by R Friend R_Friend

댓글을 달아 주세요

이번 포스팅에서는 Python pandas에서 가장 중요하게 사용되는 Data 구조인

 

 - (1) DataFrame을 만들어보고,

 

 - (2) 다양한 Attributes 를 조회

 

하는 방법에 대해서 알아보겠습니다.

 

 

먼저 필요한 Library 들을 importing 하겠습니다.

 

 

In [1]: import numpy as np

   ...: import pandas as pd

   ...: from pandas import DataFrame as df

 

 

 

 

  (1) pandas DataFrame 만들기

 

pd.DataFrame() 에서 사용하는 Paraeter 들에는 (1) data, (2) index, (3) columns, (4) dtype, (5) copy 의 5가지가 있습니다.

 

(1-1) data : numpy ndarray, dict, DataFrame 등의 data source

(1-2) index : 행(row) 이름, 만약 명기하지 않으면 np.arange(n)이 자동으로 할당 됨

(1-3) column : 열(column) 이름, 만약 명기하지 않으면 역시 np.arnage(n)이 자동으로 할당 됨

(1-4) dtype : 데이터 형태(type), 만약 지정하지 않으면 Python이 자동으로 추정해서 넣어줌

(1-5) copy : 입력 데이터를 복사할지 지정. 디폴트는 False 임. (복사할 거 아니면 메모리 관리 차원에서 디폴트인 False 설정 사용하면 됨)

 

 

3행 4열짜리 간단한 DataFrame을 만들어보겠습니다.  data  란에 input data 지정은 필수로 해줘야 하구요, 나머지 index, columns, dtype, copy는 별도로 명기를 안해줘도 디폴트 세팅이 적용되어서 DataFrame이 생성이 되긴 합니다.

 

 

In [2]: df_1 = df(data=np.arange(12).reshape(3, 4),

   ...: index=['r0', 'r1', 'r2'], # Will default to np.arange(n) if no indexing

   ...: columns=['c0', 'c1', 'c2', 'c3'],

   ...: dtype='int', # Data type to force, otherwise infer

   ...: copy=False) # Copy data from inputs

 

In [3]: df_1

Out[3]: 
    c0  c1  c2  c3
r0   0   1   2   3
r1   4   5   6   7
r2   8   9  10  11

 

 

 

 

  (2) DataFrame 의 Attributes 조회하기

 

 

다음으로 DataFrame의 Attributes을 조회하는 방법을 소개하겠습니다.

참고로, 아래 Attributes의 끝에는 괄호 ()를 붙이지 않으니 헷갈리지 않도록 조심하세요.

 

 

(2-1) T : 행과 열 전치 (transpose)

 

 

In [5]: df_1.T # Transpose index and columns

Out[5]:

c3   3   7  11
c0   0   4   8
c1   1   5   9
c2   2   6  10
c3   3   7  11 

 

 

 

(2-2) axes : 행과 열 이름을 리스트로 반환

 

 

In [6]: df_1.axes

Out[6]:

[Index(['r0', 'r1', 'r2'], dtype='object'),

Index(['c0', 'c1', 'c2', 'c3'], dtype='object')]

 

 

 

 

(2-3) dtypes : 데이터 형태 반환

 

 

In [7]: df_1.dtypes # Return the dtypes in this object

Out[7]:

c0 int32

c1 int32

c2 int32

c3 int32

dtype: object

 

 

 

 

(2-4) shape : 행과 열의 개수(차원)을 튜플로 반환

 

 

In [22]: df_1.shape # Return a tuple representing the dimensionality of the DataFrame

Out[22]: (3, 4)

 

 

 

 

(2-5) size : NDFrame의 원소의 개수를 반환

 

 

In [23]: df_1.size # number of elements in the NDFrame

Out[23]: 12

 

 

 

 

(2-6) values : NDFrame의 원소를 numpy 형태로 반환

 

 

In [24]: df_1.values # Numpy representation of NDFrame

Out[24]:

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

 

 

 

다음번 포스팅에서는 DataFrame에서 indexing 하는 방법을 소개하겠습니다.

 

 

Posted by R Friend R_Friend

댓글을 달아 주세요

이전 포스팅에서는 (1) Python의 pandas read_csv() 함수를 사용해서 외부 text, csv 파일을 읽어들이는 방법과, (2) DB connection 해서 DB로 부터 직접 Data를 읽어와서 DataFrame으로 만드는 방법을 소개하였습니다.

 

이번 포스팅에서는 이전과는 반대로 Python의 pandas library 를 사용해서 DataFrame을 csv 파일로 내보내는 방법을 소개하겠습니다.

 

pandas의 DataFrame.to_csv() 함수를 사용합니다.

 

 

먼저 실습에 필요한 Python library를 import 하겠습니다.

 

 

In [51]: import pandas as pd


In [52]: from pandas import DataFrame

 

 

 

 

다음으로, csv 파일로 내보내는데 사용할 간단한 DataFrame을 dict를 사용해서 만들어보겠습니다.

 

 

In [53]: data = {'ID': ['A1', 'A2', 'A3', 'A4', 'A5'],

    ...: 'X1': [1, 2, 3, 4, 5],

    ...: 'X2': [3.0, 4.5, 3.2, 4.0, 3.5]}


In [54]: data_df = DataFrame(data, index=['a', 'b', 'c', 'd', 'e']) # converting to DataFrame


In [55]: data_df

Out[55]:

ID X1 X2

a A1 1 3.0

b A2 2 4.5

c A3 3 3.2

d A4 4 4.0

e A5 5 3.5

 

 

 

 

결측값(Missing Value)을 csv 파일로 내보낼 때 표기 지정하는 매개변수 설명을 위해서, 제일 마지막 행(row)에 결측값을 추가해보겠습니다.

 

 

In [56]: data_df_2 = data_df.reindex(['a', 'b', 'c', 'd', 'e', 'f'])


In [57]: data_df_2 # 'f' : NaN

Out[57]:

ID X1 X2

a A1 1.0 3.0

b A2 2.0 4.5

c A3 3.0 3.2

d A4 4.0 4.0

e A5 5.0 3.5

f NaN NaN NaN

 

 

 

 

자, 이제 'data_df_2' 라는 DataFrame을 to_csv() 를 사용해서 csv 파일로 내보내보겠습니다.

DataFrame.to_csv('path\\file_name.csv', sep=',', na_rep='NaN') 의 형식으로 설정해주면 됩니다.

 

 

In [60]: data_df_2.to_csv('C:\\Documents\\Python\\data_df_2.csv', # file path, file name

    ...: sep=',',   # seperator, delimiter (구분자)

    ...: na_rep='NaN')   # missing data representation (결측값 표기)

 

 

 

 

위에 지정해준 경로에 가서 'data_df_2.csv' 파일을 열어보니 아래처럼 데이터가 잘 들어가 있음을 확인할 수 있습니다.

 

 

 

아래는 디폴트 설정으로서 참고하시기 바랍니다. (아래 디폴트 설정과 다를때만 False 로 명기하면 되며, 그 외에는 별도 명기 필요 없음)

 

header = True (첫번째 줄을 칼럼 이름으로 사용)

columns = 특정 칼럼만 csv 로 쓰기 (내보내기) 할 때 칼럼 이름을 list에 적어줌

index = True (행의 이름 index 도 같이 내보냄. index 내보내기 싫으면 False 명기)

float_format = '%.2f' (예: float8 을 소수점 둘째 자리까지 표기)

encoding = 'utf-8' (on Python 3)

line_terminator = '\n' (엔터로 줄 바꿈)

date_format = None (datetime 객체에 대한 format 설정하지 않음)

 

data_df_2.to_csv('C:/Users/admin/Documents/data_df_x2.csv',

                 sep=',',

                 na_rep='NaN', 

                 float_format = '%.2f', # 2 decimal places

                 columns = ['ID', 'X2'], # columns to write

                 index = False) # do not write index





더 많은 to_csv() 매개변수를 보기 원하면 아래 Reference 사이트를 참고하세요.

 

[Reference] http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_csv.html

 

 

Posted by R Friend R_Friend

댓글을 달아 주세요

이번 포스팅에서는 Python pandas 로 다양한 종류의 DB에 접속해서 SQL query로 Data를 select 해서 Python pandas의 DataFrame 으로 불러오는 방법을 소개하도록 하겠습니다.

 

만약 DB에 Python으로 직접 접속하지 않는 다면 DB에 있는 Data를 이용하기 위해서는 (1) DB에서 csv 파일로 데이터 exporting 하기, (2) csv 파일을 Python pandas 의 pd.csv_read() 로 불러오기의 두 단계의 절차를 거쳐야 합니다. (지난번 포스팅에서 client PC에 있는 text 혹은 csv 파일을 불러오는 방법을 소개했었습니다. )

 

이번 포스팅의 DB connection & SQL Query in Python 방법을 사용하면 csv 파일로 내리고 다시 불러오는 단계가 줄어들기 때문에 좀더 편리하게 DB로 부터 Data 불러오기를 할 수 있을 것입니다.

 

 

 

 

Oracle DB, IBM DB2, PostgreSQL, MariaDB 의 순서대로 소개하겠습니다.

사용자 정의 함수의 query 부분에 사용하고자 하는 SQL query 를 작성해서 실행하면 됩니다.

 

 

  1. Oracle DB에 Python으로 접속하여 SQL query 해서 pandas DataFrame 만들기

 

명령 프롬프트 창에서 cx_Oracle 라이브러리를 설치합니다. 


 $ pip install cx_Oracle



다음으로, 컴퓨터에서 tnsnames.ora 파일에서 연결 정보(connection information)을 찾습니다. 
아래 예시에서 색깔 칠한 부분에서 Host Name, Port Number, Service Name을 찾을 수 있습니다. 

SYSTEM_OCON =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = Host Name)(PORT = Port Number))
(LOAD_BALANCE = YES)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = Service Name)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 180)

(DELAY = 5) 


(* Reference : How to Connect Python to an Oracle Database using cx_Oracle)


이제 준비가 되었으니 Oracle DB에 Python으로 접속해서 Query를 실행시키고, 조회 결과를 Pandas DataFrame으로 가져와서 저장하는 사용자 정의함수를 정의해보겠습니다. 

##-- User defined function for Oracle DB SQL query

 

def query_OracleSQL(query):
     
     import pandas as pd
     import cx_Oracle as co
     from datetime import datetime

     start_tm = datetime.now()

     #  DB Connecion
     dsn_tns = co.makedsn("Host Name", "Port Number", service_name="Service Name")
     conn = co.connect(user="User Name", password="Personal Password", dsn=dnsStr)

     # Get a dataframe
     query_result = pd.read_sql(query, conn)

     # Close connection
     conn.close()

     end_tm = datetime.now()

     print('START: ', str(start_tm))
     print('END: ', str(end_tm))
     print('ELAP: ', str(end_tm - start_tm))


     return query_result

 

 

##-- SQL query
query = """
     SELECT var1, var2, ymd, count(*) as cnt
          FROM myOracleDB
          WHERE ymd BETWEEN
               to_date('2016-11-22T00:00:00', 'YYYY-MM-DD"T"HH24:MI:SS')
               AND
               to_date('2016-11-22T23:59:59', 'YYYY-MM-DD"T"HH24:MI:SS')
GROUP BY var1
ORDER BY cnt
               """

##-- Excute OracleDB SQL in Python
query_OracleSQL(query)

 

 

 

 

  2. IBM DB2에 Python으로 접속하여 SQL query 해서 pandas DataFrame 만들기

 

##-- User defined function for IBM DB2 SQL query
def query_DB2(query):
     import sqlalchemy as sa
     import pandas as pd
     from datetime import datetime

     # DB Connetion
     engine = sa.create_engine('ibm_db_sa://xx(id):xx(pw)@xx.xx.xxx.xx(ip):xxxx(port)/xxx(DB)', echo=False)
     conn = engineconnect()
     start_tm = datetime.now()

     # Get a dataframe
     execonn = engine.execute(query)

     query_result = df(execonn.fetchall())
     query_result.columns = execonn.keys()

     # Close connection

     end_tm = datetime.now() 
     print('START: ', str(start_tm))
     print('END: ', str(end_tm))
     print('ELAP: ', str(end_tm - start_tm))
     conn.close()
     return query_result

##-- SQL query
query = """
     SELECT var1, var2, ymd, count(*) as cnt
          FROM IBMDB2_DB
          WHERE ymd = "2016-11-22" 
 """

##-- Excute IBMDB2 SQL in Python
query_DB2(query)
 
 

 

 

  3. PostgreSQL에 Python으로 접속하여 SQL query 해서 pandas DataFrame 만들기

 

##-- User defined function for PostgreSQL DB SQL query

def query_postgreSQL(query):
     import pandas as pd
     import psycopg2 as pg
     from datetime import datetime
    

  

    # DB Connection
     conn = pg.connect(host='xx.xxx.xxx.xx',
                                        port='xxxx',
                                        dbname='xxx',
                                        user='xxxx',
                                        password='xxxx')
     start_tm = datetime.now()

     # Get a DataFrame

     query_result = pd.read_sql(query, conn)
 
     # Close connection
     end_tm = datetime.now()

     print('START: ', str(start_tm))
     print('END: ', str(end_tm))
     print('ELAP: ', str(end_tm - start_tm))
     conn.close()
 
     return query_result

##-- SQL query
query = """
     SELECT var1, var2, ymd, count(*) as cnt
          FROM PostgreSQL_DB
          WHERE ymd = "2016-11-22" 
 """

##-- Excute PostgreSQL SQL in Python
query_postgreSQL(query)

 

 

 

  4. MariaDB에 Python으로 접속하여 SQL query 해서 pandas DataFrame 만들기

 

##-- User defined function for MariaDB SQL query

def query_MariaDB(query):

     import pandas as pd
     import pymysql
     from datetime import datetime


     # DB Connection
     conn = pymysql.connect(host='xx.xxx.xxx.xxx', port=xxxx,
          user='xxxx'
          password='xxxxx'
          database='xxxxx')


     # start time
     start_tm = datetime.now()


     # Get a DataFrame
     global query_result


     query_result = pd.read_sql(query, conn)

 

     # Close connection
     end_tm = datetime.now()


     print('START TIME : ', str(start_tm))
     print('END TIME : ', str(end_tm))
     print('ELAP time :', str(end_tm - start_tm))
     conn.close()


     return query_result

 


##-- SQL query
query = """
     SELECT var1, var2, ymd, count(*) as cnt
          FROM MariaDB
          WHERE ymd = "2016-11-22" 
 """


##-- Excute PostgreSQL SQL in Python

query_postgreSQL(query)

 

 

많은 도움 되었기를 바랍니다.

 

 


Posted by R Friend R_Friend

댓글을 달아 주세요