본문 바로가기

Computer/Pandas

Pandas Series, DataFrame 이어 붙이기

반응형
 

여러 데이터 행에 함수 적용하기

Pandas를 사용하다보면 특정 함수를 여러 행에 적용하는 경우가 굉장히 많습니다. 일반적인 for 루프나 Pandas의 iterrows 이터레이터 등을 활용할 수 있지만 행이 굉장히 많은 경우에는 많이 느리게

hongl.tistory.com

지난 포스트에서는 여러 데이터 행에 대해 OLS 함수를 적용하는 여러 방법을 살펴 봤습니다. 이때 매 행마다 반복적으로 OLS를 적용하는 다음 코드를 보면 매번 Series를 만들지 않고 부분 결과의 리스트를 만든 다음에 마지막 단계에서 Series로 변환합니다. 매번 Series를 만들고 이어 붙여도 되지 않을까요?

for row_idx in range(df.shape[0]):
    row = df.iloc[row_idx]
    m = ols_lstsq(row)
    ms.append(m)
results = pd.Series(ms)

일반적으로 Pandas에서 concat 함수 (넘파이에서는 concatenate) 를 반복 호출하는 일은 피해야 합니다. 다음과 같이 매번 Series 객체를 만들어 이어 붙이게 되면 뒤에 항목을 덧붙일 때마다 새로운 Series 객체가 새로운 메모리 위치에 생기는데, 이 새 객체는 이전 객체보다 한 행이 더 깁니다. 게다가 반복할 때마다 새로운 $m$을 저장할 임시 Series 객체를 만들어야 합니다. 속도도 66.9초로 매우 느려졌습니다. (기존에는 16초 정도가 소요됩니다)

t1 = time.time()
results = None
for row_idx in range(df.shape[0]):
    row = df.iloc[row_idx]
    m = ols_lstsq(row)
    if results is None:
        results = pd.Series([m])
    else:
        results = pd.concat((results, pd.Series([m])))
t2 = time.time()

결론적으로 중간 결과를 모을 때는 직접 기존 Series나 DataFrame 객체에 새 값을 append, concat 하는 대신 리스트를 만든 다음 이 결과 리스트로부터 Series나 DataFrame을 구성하는 것이 더 좋습니다.

반응형

'Computer > Pandas' 카테고리의 다른 글

Pandas 문자열 찾기  (0) 2022.10.13
여러 데이터 행에 함수 적용하기  (0) 2022.10.13
Pandas groupby (3)  (0) 2021.08.14
Pandas - SettingWithCopyWarning  (0) 2021.08.11
Pandas groupby (2)  (0) 2021.08.07