[pandas] TypeError: unsupported operand type(s) for *: 'float' and 'decimal.Decimal' 해결기
·
Python/pandas
문제 발단 rel(상관 O) 컬럼의 값에는 1을, irrel(상관 X) 컬럼의 값에는 -0.2 값을 곱하여 더한 뒤, total_cnt로 나눠 표준화를 하고자 할 때 아래 코드를 사용했다. df['score'] = df.apply(lambda x: (x['rel']*1 - 0.2*x['irrel'])/x['total_cnt'], axis=1) 이때 발생했던 오류가 바로 TypeError: unsupported operand type(s) for *: 'float' and 'decimal.Decimal' 이다. 해당 오류는 pandas의 DataFrame에 .apply() 메서드를 사용할 때 발생했던 오류로, 파이썬에서 float 타입과 decimal.Decimal 타입 사이의 연산을 지원하지 않기 때문에..
[pandas] 두 개의 DataFrame을 SQL처럼 JOIN 하는 방법
·
Python/pandas
python으로 데이터를 분석하거나, SQL 디버깅 작업 중 pandas를 많이 사용하는데, 사이즈가 다른 두 개의 DataFrame을 하나의 컬럼을 기준으로 SQL처럼 JOIN 문을 사용하듯이 JOIN을 수행할 수 있다. Inner Join 예를 들어, 아래와 같이 df1과 df2 두 개의 DataFrame이 있다고 가정해보자. import pandas as pd df1 = pd.DataFrame({'k_id': [1, 2, 3, 4], 'A': [10, 20, 30, 40]}) df2 = pd.DataFrame({'k_id': [2, 3], 'B': [50, 60]}) 이제 두 개의 DataFrame을 Inner Join 하기 위해서는 merge() 함수를 사용한다. 이때, on 파라미터에 기준이 되..
[python] pymysql로 INSERT 할 때, 마지막 PK 값에서 1씩 증가시키는 방법
·
Python/Python Distilled
처음만나는 에러 python의 pymysql 라이브러리를 이용해서 MySQL 데이터베이스 내 특정 테이블에 INSERT를 할 때, 아래 예시와 같이, SET~; 문과 INSERT ~ SELECT; [테이블 속성1, 테이블 속성2, ...] 문 2개를 한 번에 실행해서 INSERT를 하는 경우가 있다. # 데이터베이스 INSERT 쿼리 : GolfMember 테이블에 있는 멤버의 id와 name을 Member 테이블에 추가 (중복시 name 업데이트) last_id_query = ''' SET @last_id := (SELECT MAX(id) FROM Member); -- Member 테이블의 마지막 pk 값을 변수로 저장 INSERT INTO Member (`id`, `name`) SELECT @last..
[python] pandas DataFrame Index 초기화
·
Python/pandas
pandas의 iloc(loc) 메서드나 groupby 메서드를 사용하다보면 DataFrame의 특정 행마다 Index의 연속성이 끊어질 때가 있다. 특히 groupby 메서드로 그루핑한 뒤 각 그룹별로 Index를 새로 0 부터 만들고 싶을 때 reset_index 메서드를 사용하면 된다. 아래 코드는 과일 종류가 '사과', '포도', '배'가 있다고 가정할 때, 각각의 당도가 3, 3, 5인 DataFrame을 예시로 든다. # col_0, col_1 을 각 컬럼으로 하는 DataFrame df = pd.DataFrame({'과일': ['사과', '포도', '배'], '당도': [3, 3, 5]}) 결과 과일당도 0사과3 1포도3 2배5 위에서 만든 DataFrame(df)에서 '당도'를 기준으로 그..
[Python] SMTP, email, pandas 라이브러리 활용한 이메일 자동화 (RPA) (한글 깨짐 해결)
·
Python/Python Distilled
개발 환경 - 이메일 서버/포트/2차 인증 사용 여부 SERVER: smart.whoismail.net PORT: 587 2차 인증 사용 여부: 사용안함 RPA 프로세스 pymysql connect 로 세션 생성 pandas 라이브러리로 DB를 조회하여 DataFrame 으로 저장 (DB에 발송할 이메일 주소를 함께 가져오지만, 보안상 간단히 DataFrame 내 'A' Column 으로 가정) 발송할 메일 내용이 될 HTML 템플릿을 만든다. for loop을 돌면서 HTML 템플릿 내부에 df.to_html() 메서드로 만든 df 테이블을 삽입한다. 메일 발송 코드 전문 import os import datetime import pymysql # MySQL Server connection import..
jupyter notebook 가상환경 연결하기 (아나콘다)
·
Python/Anaconda
문제 발생 scikit-learn, seaborn, graphviz만 설치된 가상환경을 아나콘다로 새로 생성. vscode에서 작업 후, mark-down으로 ML 학습을 정리하려 jupyter notebook을 열어 실행결과를 확인하려는데, scikit module을 찾을 수 없다는 ModuleNotFoundError: No module named 'sklearn' 에러가 발생. 이를 해결하기 위해 구글링 후, jupyter notebook에 원하는 가상환경을 연결하는 방법을 찾아서 해결함. 이 포스팅은 해결 과정을 작성함. 본인의 환경 - macbook m1 macOS - brew로 python 3.10.7 설치 (python 설치 경로: /opt/homebrew/bin/) (명령어: brew ins..
[python] 대입 연산자 (:=)
·
Python/Python Distilled
표현식이란 구체적인 값으로 평가하는 계산을 의미한다. 표현식은 항상 대입문의 오른쪽에 나타난다. 이 포스팅은 리터럴, 이름, 연산자, 함수 등의 조합으로 표현식이 주어질 때, 대입 연산자를 사용하는 방법에 대한 글이다. 대입 연산자는 := 로 표현하는데, 바다코끼리 엄니와 비슷하게 생겨서 바다코끼리 연산자라고도 한다. While (n:=f.readline()): print(n) 위의 예시에서 n:=f.readline() 부분은 괄호로 감싸주지 않으면 문법 오류로 실행되지 않는다. 다른 예시로, 표현식을 평가에 사용하는 경우가 있다. if (len(n):=f.readline) >= 10: print(n)
[python] 이스케이프 표현식(escaped expression)
·
Python/Python Distilled
문자열 앞에 f가 붙으면 문자열 안에 있는 이스케이프 표현식이 평가된다. 예시) year = 2022 principal = 0.01666 print(f'{year:>3d} {principal:0.2f}') >>> 2022 0.02 첫 번째로 {year:>3d}의 의미를 하나씩 뜯어보자. (1) year 변수 뒤 :> 는 우측으로 정렬한다는 뜻이다. (2) :> 뒤 숫자 3 은 3칸(공백 문자)을 확보한다는 뜻이다. 만약 입력되는 year의 길이가 3 이상이면 칸을 확보하지 않는다. (3) 숫자 3 뒤 d는 int형으로 출력한다는 뜻이다. (1) (2) (3)의 뜻을 모두 합치면, (1) 우측으로 정렬하면서 (2) 문자열 변수의 길이가 3 미만일 때 길이가 3 이 되도록 공간을 확보하고 (3) 변수를 in..