df['test'] = np.where(조건, 참일 때 값, 거짓일 때 값) 형태로 쓰게 되는데

각 line별로 function을 태우고 그 값을 넣고 싶을 때가 생긴다.

그 경우 lambda를 활용할 수 있다.

df["test"] = df.apply(lambda r: func(r.col0, r.col1), axis=1)

여기서 axis는 컬럼 기준으로 작업할지, 행 기준으로 작업할지에 대한 매개변수다.

axis=1일 경우 컬럼 기준, 0인 경우 행 기준으로 작업한다.

 

함수의 return이 여러 개인 경우엔,

df["test1"], df["test2"], df["test3"] = zip(*df.apply(lambda r: func(r.col0, r.col1), axis=1))

들어갈 각 열들을 나열하고, zip으로 묶어주면 return의 순서대로 값이 들어간다.

python에서는 굉장히 간단한 형태로 string의 empty 여부를 확인한다.

string 자체를 bool이 들어갈 자리에 두면 값이 있는 경우 True, 빈 경우 False를 반환한다.

(strip()이랑 같이 쓰면 IsNullOrWhitespace 처럼 쓸 수 있다.)

여기에 and나 or 같은 논리연산자가 들어가면

가장 마지막에 검사된 값을 반환한다.

예를 들어,

True or 'test'는 True를 반환한다. (True만 검사하면 무조건 True)

True and 'test'는 'test'를 반환한다. ('test'까지 검사해야 True, False를 알 수 있기 때문)

False and 'test'는 False를 반환한다.(False만 검사하면 무조건 False)

 

이런 고로 논리연산자를 쓸 때 괄호를 쳐주지 않으면 제대로 인식이 되지 않는 케이스가 생긴다.

가령 df[df["test"] == test and df["test1"] == "test"] 같은 형태는

the truth value of a series is ambiguous. use a.empty a.bool() a.item() a.any() or a.all()

같은 에러가 난다.

df[(df["test"] == test) and (df["test1"] == "test")]

괄호로 묶어주면 식이 유효한 경우 에러가 사라진다.

 

numpy의 경우 and, or 대신 &, | 를 사용해야 되는 케이스가 많다.

파이썬은 객체 지향 함수이기 때문에 모듈을 import하고 그 객체로부터 메서드(함수)를 뽑아 쓴다.

먼저 메서드가 정의된 파일(모듈)이 abc.py라 가정하고 다음과 같은 내용이 있다고 하자.

def add(a, b):
    return a+b

def minus(a,b):
    return a-b

import abc를 하면 abc 객체를 생성할 수 있다.

그 객체에서 메서드를 뽑아서 사용하면 된다.

a = abc.add(3, 5)

b = abc.minus(3, 5)

 

다른 패키지들도 마찬가지다.

가령 DB에 연결하게 해주는 pymysql 패키지는 import된 후

conn=pymysql.connect(
  host=connHeader['host'],
  port=connHeader['port'],
  user=connHeader['user'],
  password=connHeader['password'],
  db=connHeader['db'],
  charset=connHeader['charset']
)

이런 형태로 연결 객체를 만들어 준다.

1. 판다스의 자료 구조와 장점

Pandas에서 자료구조는

시리즈(Series)라 불리는 Columnal 데이터와

DataTable과 유사한 형태의 테이블 데이터인 데이터프레임(DataFrame)이 있다.

 

기본 자료구조가 정해진 컬럼을 주렁주렁 달고 다니는 row 형태가 아닌 column 형태라서

자료 가공을 하면서 조건에 맞는지 여부를 따질 때, 다른 컬럼을 소환하지 않고 작업할 수 있다.

따라서 작업 속도가 빠르고 데이터 관련 가공은 Pandas를 많이 쓴다.

 

비슷한 궤로 통계를 이용한 데이터 가공에도 강하다.

OLS 같은 통계추정량을 구할 때도 필요한 coefficients 이외는 residual로 처리하는 방식이기 때문에

회귀방정식에 넣는 column만 바로 적용될 수 있다.

[역으로 기존 RDB 형식으로만 작업하면 굉장히 비효율적으로 수행할 거 같다.]

 

2. 현재 사용하는 판다스 버전

터미널에서 pip install pandas=={버전}를 하면 numpy는 종속이라서 같이 깔린다.

현재 연습용으로 버전은 1.2.4를 쓰고 있다.

import numpy as np
import pandas as pd

데이터프레임에 데이터를 담기 위해 Excel을 썼는데 DRM에 걸려 판다스로 바로 읽는 것은 불가했다.

import xlwings as xw

그래서 xlwings도 깔아줬다.

 

3. 컬럼 추가 방법

# 엑셀 파일 이름
filename = 'test2.xlsx'
# 엑셀 인스턴스 생성
app = xw.App(visible=False)
# 엑셀 읽은 객체 생성
wb = xw.Book(filename)
# 데이터프레임 형태로 읽기
df = wb.sheets(1).used_range.options(pd.DataFrame, index=False).value
# 인스턴스 종료
app.kill()

xlwings를 써서 읽으면 엑셀이 켜진다. 그래서 인스턴스를 잡고 닫을 수 있게 했다.

자료에 따로 index가 따로 없으면 index=False로 해야 한다. (기본값은 True)

 

df도 dt랑 비슷해서 df['컬럼명'][1] 같은 식으로 하나의 cell value를 가져올 수 있다.

[다만 columnal이기 때문에 기준이 되는 column이 먼저 쓰임]

# 컬럼 추가
df['Test'] = np.where(df['Column1'].isnull(), "값 없음", df['Column2'])

컬럼의 기본값 필터링을 위해선 numpy 객체를 쓴다.

where 메서드를 쓰고 3항연산자 형태로 입력하면 기본값이 조건에 맞게 구성된다.

 

 

4. row 필터링

# 필터링
df = df[(df['Test'] != '값 없음')]

파이썬 문법 중 특이하면서도 편리한 부분은 리스트 형태의 변수 안에 조건만 쓰면 알아서 필터링 된다는 점이다.

row 필터링은 컬럼명을 쓰는 부분에 해당하는 컬럼 조건을 써주면 된다.

string 관련 여부를 체크하려면 하기와 같이 쓴다.

df = df[df['abc'].str.contains("포함여부 확인하고 싶은 str")]

 

+ Recent posts