케이스: 구글시트에서 여러 config 시트를 가져와 for문을 돌리면서 컬럼별 데이터 타입 변환

최초 접근은 이랬다.

dfs = [df1, df2, df3, df4]

for df in dfs:
	for col in df.columns:
    	if '날짜' in col or '일자' in col:
        	df[col] = pd.to_datetime(df[col])
        elif '금액' in col or '수수료율' in col or '분담률' in col:
        	df[col] = df[col].astype(float)
        else:
        	df[col] = df[col].astype(str)

inplace가 안 되는 현상(함수에서 가져다 쓰려고 하면 기존 object 형태)

찾아보니 iteration이 진행되는 전제에 문제가 있었다.

iteration은 기본적으로 해당 iteration의 item에 대한 기존값의 변경을 전제하지 않는다.

그걸 전제하면 update나 delete 행위가 iteration을 하는 변수 자체에 가해지는 경우,

최초에 설정된 iterator가 변경되기 때문이다. [ex) 1~5까지 반복하는데 첫번째 loop에서 4,5를 지워버리는 식]

그렇다고 모든 update 행위가 안 되는 것은 아니어 보인다. 논리적으로 성립 가능한 update 행위도 있을 수는 있다.

다만 이런 가능성은 습관적으로 배제하는 것이 좋다.

dfs = [df1, df2, df3, df4]
sheets = {}

for idx, df in enumerate(dfs):
	for col in df.columns:
    	if '날짜' in col or '일자' in col:
        	con_df[col] = pd.to_datetime(df[col])
        elif '금액' in col or '수수료율' in col or '분담률' in col:
        	df[col] = df[col].astype(float)
        else:
        	df[col] = df[col].astype(str)
    sheets[idx] = df

iteration을 수행하면서 해당 변수를 업데이트/삭제를 하는 경우 새로운 container에 담는 습관을 들여야 겠다.

(특히 형변환)

+ Recent posts