"Pandas:DataFrame:다른 형태로 저장하고 불러오기"의 두 판 사이의 차이

Pywiki
둘러보기로 가기 검색하러 가기
70번째 줄: 70번째 줄:
 
engine = create_engine("mysql+pymysql://{user}:{pw}@localhost/{db}"
 
engine = create_engine("mysql+pymysql://{user}:{pw}@localhost/{db}"
 
                       .format(user="root",  # sql 계정 입력.
 
                       .format(user="root",  # sql 계정 입력.
 +
                              domain='localhost',      # 도메인 주소
 
                               pw="0000",  # sql 비밀번호 입력.
 
                               pw="0000",  # sql 비밀번호 입력.
 
                               db="dbname"))  # 연결할 db이름 입력.
 
                               db="dbname"))  # 연결할 db이름 입력.
80번째 줄: 81번째 줄:
 
옵션은 아래에서 설명한다.
 
옵션은 아래에서 설명한다.
 
|<syntaxhighlight lang="python">
 
|<syntaxhighlight lang="python">
data.to_sql('테이블명', con = engine, if_exists = 'append', chunksize = 1000)
+
df.to_sql('테이블명', con = engine, if_exists = 'append', chunksize = 1000)
 
</syntaxhighlight>
 
</syntaxhighlight>
 
|-
 
|-
100번째 줄: 101번째 줄:
 
|replace
 
|replace
 
|기존의 데이터를 대체한다.(테이블 단위로 덮어씌워, 기존 데이터는 사라진다.)
 
|기존의 데이터를 대체한다.(테이블 단위로 덮어씌워, 기존 데이터는 사라진다.)
 +
(테이블 세팅도 바꾼다.)
 
|-
 
|-
 
|fail
 
|fail

2022년 1월 3일 (월) 16:02 판

1 개요

데이터프레임을 사용했다면 그냥 여기에서 멈추는 것이 아니라, 다른 형태로 저장해두어야 추후에 불러와 사용할 수 있다.

2 엑셀

2차원 데이터를 다루는 가장 쉬운 방법은 엑셀을 이용하는 것. 저장하고 시각화 하는 데 엑셀을 이용한다면 굉장히 편리할 것이다.

엑셀 관련기능을 사용하려면 관련 라이브러리를 설치해야 한다.

과정 설명 방법
파일 저장하기 openpyxl 따위의 라이브러리 설치가 선행되어야 한다. 따위의 라이브러리 설치가 선행되어야 한다.(pip install openpyxl)

아래 두 방법으로 df 엑셀에 저장한다. 체.to_excel('c:\\경로.xlsx')

객체.to_csv('c:\\경로.csv')

import os  # 저장경로를 지정하기 위함.

wd = os.getcwd()  # 현재 디랙터리.
file_dir = '{}\\경로명\\'.format(wd)    # 저장할 경로 지정.
file_name = '파일이름'                  # 저장할 이름 지정.
df.to_excel(file_dir + file_name)       # 파일저장.
파일 불러오기 openpyxl 따위의 라이브러리 설치가 행되어야 한다. 따위라이브러리 설치가 선행되어야 한다.(pip install openpyxl)

아래 두 방법으로 불러온다.

객체 = pandas.read_excel('c:\\경로.xlsx')

객체 = pandas.read_csv('c:\\경로.csv')

저장했던 엑셀파일을 불러오면 저장한 df 그대로 사용되는 게 아니라, 엑셀의 제한된 기능에 따라 변형되기 때문에 칼럼을 다시 만져주어야 제대로 사용할 수 있다. 기본적으로 맨 윗줄을 칼럼 처리한다.(상관없으면 그냥 쓰고;)

때문에 df['열이름'] = pd.to_numeric(df['열이름']) 형태로 데이터형을 다시 통일, 설정해주어야 한다.


인덱스 지정은 따로 하지 않는다. 'index_col=숫자' 옵션으로 인덱스를 지정할 수도 있다.

Sheet_name='시트명' 옵션으로 해당 시트를 열 수도 있다.

3 mysql

mariasql도 동일하다.

3.1 sqlalchemy 사용

이 방법은 굉장히 간단하다. 다만, 프라이머리키가 중복된 데이터가 있는 경우엔 적용할 수가 없다.(이런 경우엔 겹치는 데이터를 제거해준 후 넣어야 한다.)

과정 설명 방법
라이브러리 설치 pip install sqlalchemy
모듈 임포트 from sqlalchemy import create_engine
엔진 연결 DB를 만든 후에 DB와 연결할 수 있다.
engine = create_engine("mysql+pymysql://{user}:{pw}@localhost/{db}"
                       .format(user="root",  # sql 계정 입력.
                               domain='localhost',       # 도메인 주소
                               pw="0000",  # sql 비밀번호 입력.
                               db="dbname"))  # 연결할 db이름 입력.
sql로 전환 이미 만들어진 테이블에 dataframe을 넣는다.

(역시, 테이블은 미리 준비되어야 한다.)

옵션은 아래에서 설명한다.

df.to_sql('테이블명', con = engine, if_exists = 'append', chunksize = 1000)
옵션값
인자 설명
if_exists
옵션 설명
appends 기존에 데이터가 들어가 있으면 덧붙인다.
replace 기존의 데이터를 대체한다.(테이블 단위로 덮어씌워, 기존 데이터는 사라진다.)

(테이블 세팅도 바꾼다.)

fail 테이블 안에 데이터가 있으면 아무것도 하지 않음.
chunksize 한 번에 몇 개의 데이터를 처리할지.

3.1.1 관련에러

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045, "Access denied for user '.....'@'localhost' (using password: YES)")

위 형태의 에러는... 99% 확률로 DB에 대한 정보를 잘못 입력했기 때문에 나오는 에러이다.

3.2 단순 입력

중복된 데이터는 그냥 건너뛰고 새로운 값을 넣어주고 싶을 때 사용하는 방법이다.

과정 설명 방법
라이브러리 설치 pip install pymysql
모듈 임포트 import pymysql
DB연결 DB = pymysql.connect(host='localhost', port=3306, db='db이름', user="root", passwd='비밀번호', charset='utf8')
커서생성 sql을 순회하는 커서 생성 cur = self.coinDB.cursor()
함수제작 함수로 만들어 처리하면 편할 듯하다.

DB 객체와 테이블명을 넣어 작동한다.

def df_to_db(df, db, table):
    '''df를 받아 db에 저장하는 것.'''
    cur = db.cursor()  # 커서를 만든다.
    cols = "`,`".join([str(i) for i in df.columns.tolist()])  # df의 칼럼을 추출한다.
    for i, row in df.iterrows():  # 하나씩 입력한다.
        try:
            sql = "INSERT INTO `{table}` (`{cols}`) VALUES (".format(table=table, cols=cols) +  "%s," * (
                        len(row) - 1) + "%s)"  # 마지막엔 쉼표 없이.
            cur.execute(sql, tuple(row))
            # the connection is not autocommitted by default, so we must commit to save our changes
            db.commit()
        except Exception as e:
            # print(e)
            pass