안녕하세요 먼지입니다.
gpt를 쓰면서 작업을 하게 되는데 가끔 사용해본 적 없는 코드를 짜주는 경우가 있습니다. 좋은 코드인데도 몰랐던 경우들이 있어 하나씩 정리해보려 합니다. 이번에 정리해볼 grouped객체를 for문에서 사용하는 법입니다. 동적으로 group by를 해주는 전처리 과정에서 사용했던 코드인데, 언뜻보면 group by를 하는 거 같지만 필터링 기능이라고 보시면 좋을 것 같습니다.
작동 예시를 보여드리고 어떤 때 쓰면 좋을지 간단하게 적어보겠습니다.
예시 데이터는 아래와 같습니다.
# 예시 데이터
import pandas as pd
df = pd.DataFrame({
"category": ["Electronics", "Electronics", "Clothing", "Clothing", "Electronics"],
"client": ["ClientA", "ClientA", "ClientB", "ClientB", "ClientC"],
"region": ["Seoul", "Busan", "Seoul", "Busan", "Seoul"],
"transaction": ["Sale", "Sale", "Return", "Sale", "Return"],
"amount": [1000, 1500, 500, 700, 1200]
})
print(df)
(사용예시) grouped 객체를 for문에 사용하기
grouped객체는 2가지로 나눌 수 있었습니다. 아래 코드의 결과는 어떻게 될까요?
grouped = df.groupby(["category", "client"])
for group_values, group_df in grouped:
print("group_values:", group_values)
print(group_df, "\n")
모든 group by 경우의 수에 대해 데이터프레임을 나눌 수 있게 됩니다. 각각의 제품 카테고리와 클라이언트에 대한 데이터프레임을 산출할 수 있습니다. 결과를 보면 (의류,clientB), (전자기기,clientA), (전자기기, ClientB)로 필터링 된 데이터프레임을 뽑을 수 있는 것을 볼 수 있습니다.
<Output>
(1) group_values: ('Clothing', 'ClientB')
group_df :
category | client | region | transaction | amount |
Clothing | ClientB | Seoul | Return | 500 |
Clothing | ClientB | Busan | Sale | 700 |
(2) group_values: ('Electronics', 'ClientA')
group_df :
category | client | region | transaction | amount |
Electronics | ClientA | Seoul | Sale | 1000 |
Electronics | ClientA | Busan | Sale | 1500 |
(3) group_values: ('Electronics', 'ClientC')
group_df :
category | client | region | transaction | amount |
Electronics | ClientC | Seoul | Return | 1200 |
느낀점
아마 제가 코드를 작성했다면 아래처럼 작성하지 않았을까 싶습니다. 일일이 group by 케이스인 행을 찾는 로직이라 코드 작동시간이 훨씬 길어졌을 것 같습니다. 코드 자체도 grouped 객체를 사용한 for문이 훨씬 깔끔한 것 같네요.
# 모든 행에 대해 필터링
unique_groups = df[group_keys].drop_duplicates()
for _, row in unique_groups.iterrows():
cond = True
for col in group_keys:
cond &= (df[col] == row[col])
group_df = df[cond]
이번 포스팅은 간단하게 마무리하겠습니다. 더 쓰면 너무 길어질 거 같아 기회가 된다면 다음 포스팅에서 더 작성해보도록 하겠습니다. 감사합니다 :)
'데이터분석 > 데이터 전처리' 카테고리의 다른 글
[pandas] 한달 전 월말 날짜 구하기 (0) | 2023.03.17 |
---|---|
[pandas] if 문으로 빈 데이터프레임 거르기 (0) | 2023.03.16 |
[pandas] 데이터프레임 날짜 인덱스 늘리기(reindex) (0) | 2023.03.16 |
[Pandas] 데이터 음수값 없애기 (0) | 2023.03.14 |