Python 266

[boto3] S3 Select - OverMaxRecordSize 에러 대안

개요 아래와 같이 S3 Select 기능을 이용해 S3 버킷에 저장된 GZIP으로 압축된 JSON 데이터의 내용을 읽어 들이려고 한다. import boto3 client = boto3.client('s3') response = client.select_object_content( Bucket=bucket, Key=obj_key, Expression='SQL', ExpressionType='SQL', InputSerialization={ 'CompressionType': 'GZIP', 'JSON': { 'Type': 'LINES' } }, OutputSerialization={ 'CSV': {}, }, ) for event in response.get('Payload'): if 'Records' in e..

Python 2023.01.21

[Python] Pandas - DataFrame 문자열 변환

개요 DataFrame 내용을 Slack이나 MS Teams Webhook으로 알람을 보내는 등의 이유로 DataFrame을 문자열로 변환하고자 한다. to_string DataFrame을 콘솔 친화적인 형식으로 렌더링 한다. 예로 들어 titanic 데이터세트를 출력하면 아래와 같다. import numpy as np import pandas as pd import seaborn as sns titanic = sns.load_dataset("titanic") titanic to_string 함수를 사용해서 문자열로 렌더링 하면 다음과 같다. 주피터 노트북에서는 문자열로 렌더링 한 DataFrame은 print 함수로 출력하는 게 보기 편하다. print(titanic.to_string()) 인덱스 빼고..

[Python] Pandas - 반복문으로 DataFrame 합치기

개요 이 글에서는 같은 구조의 DataFrame을 반복적으로 만든 뒤, 하나의 DataFrame으로 합치는 방법에 대해 정리한다. DataFrame을 합치는 방법으로는 concat, merge, append, join 등의 함수가 존재한다. 다만 기준 열을 이용해 합치는 것이 아니라 단순히 세로로 데이터 연결을 하고자 하므로 이 글에서는 concat과 append를 살펴볼 것이다. 아래 데이터를 예시로 정리한다. import numpy as np import pandas as pd import seaborn as sns titanic = sns.load_dataset("titanic") append 행 끝에 다른 행을 추가한 새 DataFrame을 반환한다. 추가할 DataFrame의 인덱스를 무시할 때..

[Python] Pandas - DataFrame NaN 포함 행 제거

개요 DataFrame을 저장할 때 NaN을 포함한 행은 제외하고 저장하고자 한다. 아래 데이터를 예로 들어 방법을 정리한다. import numpy as np import pandas as pd import seaborn as sns planets = sns.load_dataset('planets') planets 데이터 확인 df.info 함수를 이용해 DataFrame에 저장된 데이터의 정보를 간단히 살펴본다. info 함수를 이용하면 객체의 타입, 인덱스 길이와 범위, column의 이름과 데이터 타입, 그리고 결측값이 아닌 데이터의 개수 등의 정보를 확인할 수 있다. planets.info() # 실행 결과 RangeIndex: 1035 entries, 0 to 1034 Data columns ..

[Python] Pandas - DataFrame 컬럼 순서 변경

개요 DataFrame으로 데이터를 추가하다 출력할 때가 되면 데이터를 추가한 순서가 보기 편한 순서와 달라 데이터가 눈에 잘 안 들어오는 경우가 있다. 아래의 데이터를 예시로 들어 DataFrame의 컬럼 순서를 변경하는 방법을 정리해둔다. import seaborn as sns titanic = sns.load_dataset("titanic") titanic 컬럼 나열 원하는 순서로 컬럼을 다시 나열하여 인덱싱 한다. df.columns 속성을 이용하면 필요한 컬럼을 빠트리지 않을 수 있다. titanic.columns # 실행 결과 Index(['survived', 'pclass', 'sex', 'age', 'sibsp', 'parch', 'fare', 'embarked', 'class', 'who..

[Python] 빈 DataFrame 생성 / 확인

개요 DataFrame을 다루다보니 빈 DataFrame을 생성하거나 DataFrame이 비어있는지 여부를 확인해야 하는 경우가 있었다. 방법을 간단히 정리해둔다. 빈 DataFrame 생성 DataFrame을 생성할 때는 컬럼과 데이터를 딕셔너리로 정의해서 생성자로 전달했다. 다만 빈 DataFrame을 생성할 때는 데이터 없이 생성자를 호출하면 된다. df = pd.DataFrame() print(df) # 실행 결과 Empty DataFrame Columns: [] Index: [] 컬럼이 있는 빈 DataFrame 생성 데이터는 없지만, 컬럼을 지정하여 DataFrame을 생성해야 할 때는, columns 매개변수로 컬럼 이름만 전달한다. df = pd.DataFrame(columns=['날짜']..

[Python] Pandas - 시계열 자료 다루기 3

dt datetime 자료형을 다룰 때는 dt 접근자를 이용해 datetime 자료형이 가진 속성과 메서드를 사용할 수 있다. 아래의 데이터를 예로 들어 정리한다. s = pd.Series(pd.date_range("2020-12-25", periods=100, freq="D")) s # 실행 결과 0 2020-12-25 1 2020-12-26 2 2020-12-27 3 2020-12-28 4 2020-12-29 ... 95 2021-03-30 96 2021-03-31 97 2021-04-01 98 2021-04-02 99 2021-04-03 Length: 100, dtype: datetime64[ns] 년, 월, 요일 정보 얻기 dt 속성을 통해 year, month, day, weekday 정보를 얻..

[Python] Pandas - 시계열 자료 다루기 2

resample 시간 간격을 재조정하는 함수이다. 시간 구간이 작아지면 데이터 양이 증가하여 업 샘플링이라고 하고, 시간 구간이 커지면 데이터 양이 감소하여 다운 샘플링이라고 한다. 다운 샘플링 예로 들어 아래와 같은 일자별 데이터가 있다고 하자. ts = pd.Series(np.random.randn(100), index=pd.date_range( "2018-1-1", periods=100, freq="D")) ts.tail(10) # 실행 결과 2018-04-01 0.422802 2018-04-02 1.948651 2018-04-03 -0.567525 2018-04-04 1.592544 2018-04-05 1.947456 2018-04-06 0.966879 2018-04-07 0.136668 2018..

[Python] Pandas - 시계열 자료 다루기 1

시계열 자료 인덱스가 날짜, 시간이 데이터를 시계열 자료라고 한다. Pandas에서 시계열 자료를 생성하기 위해서는 특정한 순간에 기록된 타임스탬프 형식의 자료를 다루기 위한 DatetimeIndex 자료형으로 만들어야 한다. 인덱스인 타임스탬프가 일정한 간격일 필요는 없다. DatetimeIndex는 아래와 같은 함수를 이용해 생성한다. to_datetime 날짜, 시간을 나타내는 문자열을 datetime 자료형으로 변환한 뒤 Datetimeindex를 생성한다. date_str = ["2018, 1, 1", "2018, 1, 4", "2018, 1, 5", "2018, 1, 6"] idx = pd.to_datetime(date_str) idx # 실행 결과 DatetimeIndex(['2018-01-..

[Python] Pandas - DataFrame column 추가

개요 pandas DataFrame에 column 추가하는 방법을 정리한다. 일반적인 방법 Dictionary와 비슷하게 대괄호에 column 이름을 지정하여 값을 초기화한다. 추가되는 열은 가장 오른쪽에 위치한다. df1 = pd.DataFrame({ '고객번호': [1001, 1002, 1003, 1004, 1005, 1006, 1007], '이름': ['둘리', '도우너', '또치', '길동', '희동', '마이콜', '영희'] }, columns=['고객번호', '이름']) df1 df1['금액'] = 0 df1 # 실행 결과 고객번호이름 01001둘리 11002도우너 21003또치 31004길동 41005희동 51006마이콜 61007영희 고객번호이름금액 01001둘리0 11002도우너0 210..