Pandas에서 Dataframe 한 줄씩 처리하기

Pandas에서 반복문을 이용해 Dataframe 한 줄씩 처리하기

용량이 큰 데이터프레임에서 한 줄씩 처리하는데 컬럼별로 이것저것 조건줘야하는 일이 생겼다.

일단 기존에 알고있던 방식대로 df.index를 for문 돌리면서 loc를 이용해 수행하는데 너무 느려서(…) 좀 더 빠른 방식이 없나 찾아보다가 알게된 것들을 정리해보았다.


📍pd.iterrows()

얜 느리다고 해서 제대로 공부안함..
데이터프레임 접근방식하고 동일하게 접근 가능한 것 같다.
약간 데이터프레임을 행방향으로 잘라서 주는 느낌…

result = []
for row in df.iterrows():
    value = row['col']
    result.append(value)

📍pd.loc() / pd.iloc()

loc/iloc가 pd.iterrows()보다 2.5배정도 빠르다고 한당

loc는 라벨명으로 iloc는 위치인덱스(숫자)로 접근..

result = []
for idx in df.index():
    value = df.loc[idx,'col']
    result.append(value)

📍pd.at() / pd.iat()

pd.get_value()/pd.set_value() 이게 loc/ iloc보다 빠르다고해서 찾아보다가 처음 알게됐다.

pd.get_value()/pd.set_value()는 판다스 0.21버전에서 없어졌다고 한다.

at, iat은 하나의 값을 가져올때 사용하는 것 같다.

iterrows보단 4배정도 빠르다고 함

result = []
for idx in df.index():
    value = df.at[idx,'col']
    result.append(value)

✔️ pd.at() vs pd.loc() 둘이 뭔차이?

공식문서에 따르면 아래와 같이 정의되어 있다.

  • pd.at() : Access a single value for a row/column label pair.
  • pd.loc() : Access a group of rows and columns by label(s) or a boolean array.

at은 하나의 값만, loc는 여러개 가능. 그래서 at은 아래처럼 슬라이싱을 넣으면 오류가 난다

value = df.at[1:20,'col'] #에러남
value = df.loc[1:20,'col'] #에러안남

📍pd.itertuples()

대망의 itertuples() iterrows보다 8배이상 빠르다고한다.

나도 얘 활용해서 문제 해결했다

10개에 20초 걸리던게 10개에 2초 정도로 줄었다.. 그저 감동..

이것도 iterrows 처럼 한줄씩 불러서 다루는건데 결과물이 약간 dict느낌?

그래도 dataframe 다루는거랑 거의 비슷하다.

result = []
for row in df.itertuples():
    value = row.ID
    result.append(value)

✔️ col 이름을 지정해서 주고 싶을 때는?

iterrows와 다르게 itertuples는 row[‘col’] 형식이 먹히지 않는다.

row.ID 이런식으로 직접 적을때는 상관이 없지만 여러 컬럼조건을 줘야해서 외부에서 컬럼명을 변수 설정하고 row에서 처리하고 싶을 때가 있다.

그럴땐 getattr(row,col) 이런식으로 써서 값을 얻으면 된다.

result = []
col_name = 'ID'
for row in df.itertuples():
    value = getattr(row,col_name)
    result.append(value)

따봉 itertuples()야 고마워~~~

  • itertuples의 결과물이 dict같다고했는데 공식문서 찾아보니 namedtuple형식이란다. namedtuple에 대해선 내일 알아봐야지…

참고 Pandas Dataframe의 다양한 iteration 방법 비교 > 판다스 공식문서