코딩하는 타코야끼

[Pandas] 4-1강_groupby 관련 메소드 본문

[T.I.L] : Today I Learned/Pandas

[Pandas] 4-1강_groupby 관련 메소드

가스오부시 2023. 4. 19. 20:24
728x90
반응형

1. filter( )

  •  DataFrameGroupBy.filter(func, dropna=True, *args, **kwargs) 
  • 특정 조건을 만족하는 Group의 데이터(행)들을 조회할 때 사용한다. 주로 조건은 group별 집계결과를 이용한다.
    1. 함수에 group별 DataFrame을 argument로 전달한다.
    2. 함수는 받은 DataFrame을 이용해 집계한 값의 조건을 비교해서 반환한다.(반환타입: Bool)
    3. 반환값이 True인 Group들의 모든 행들로 구성된 DataFrame을 반환한다.

🌓  매개변수

  • func: filtering 조건을 구현한 함수 객체
    • 첫번째 매개변수로 Group으로 묶인 DataFrame을 받는다.
    • bool type 값을 반환한다. 매개변수로 받은 DataFrame이 특정 조건을 만족하는지 여부를 반환한다.
  • dropna=True
    • 필터를 통과하지 못한 group의 DataFrame의 값들을 drop시킨다(기본값). False로 설정하면 NA 처리해서 반환한다.
  • args, **kwargs: filter 함수의 두번째부터 선언된 매개변수에 전달할 argument 값들을 가변인자로 전달한다.
def check_mean(df):
    """
    df - DataFrame. filter 에 사용하면 Group별 DataFrame이 넘어온다.
    """
    return df['cnt1'].mean() >= 20
df.groupby('fruits').filter(check_mean)
  • lambda 표현식 이용
df.groupby('fruits').filter(lambda df : df['cnt1'].mean() > 20) 
#return 결과가 True인 group의 dataframe이 결과에 추가.


2. transform

  •  DataFrameGroupBy.transform(func, *args)SeriesGroupBy.transform(func, *args) 
    • 함수(func)에 열의 값들을 group 별로 전달 한다. 함수는 그 값을 받아 통계량을 구해 반환한다. 반환된 통계량으로 원래 값들을 변경한 Series를 반환한다. 여러 컬럼에 대해 처리할 경우 DataFrame을 반환한다.
    • func: 함수객체
      • 매개변수
        • 그룹별 컬럼값들을 받을 변수 선언
      • return
        • 계산한 통계량.
      • DataFrameGroupBy은 모든 컬럼의 값들을 group 별 Series로 전달한다.
    • args: 함수에 전달할 추가 인자값이 있으면 매개변수 순서에 맞게 값을 전달한다.
  • transform() 함수를 groupby() 와 사용하면 컬럼의 각 원소들을 자신이 속한 그룹의 통계량으로 변환된 데이터셋을 생성할 수 있다.
  • 컬럼의 값과 통계값을 비교해서 보거나 결측치 처리등에 사용할 수있다.
  • 디테일하게 그룹별로 비교할때 사용한다.

📍 원본에 통계치 붙여서 비교하기

  • DataFrameGroupby -> group별로 각 컬럼의 값을 함수에 전달.
  • 사과->cnt1, 귤->cnt1, 사과-> cnt2, 귤->cnt2
result = df.groupby('fruits').transform('mean')
result

🌓  df.insert(삽입할 컬럼 순번, 컬럼이름, 값들) - 컬럼(열) 삽입

df.insert(1, "cnt1평균", result['cnt1'])
df

🌓 sample( ) - random하게 행 추출

df2.sample(n=3) # random하게 행을 추출해준다.

df2.sample(frac=0.3) # 비율 (전체중 30%의 행만 추출)

df2 = df2.sample(frac=1) # frac= 1.0 -> 섞기만 하겠다.
df2.reset_index(drop=True)


📍 filna( ) - 결측치 처리

  • transform이용해서 결측치를 같은 과일별 평균값으로 변환
    • 전체 평균보다 좀더 정확할 수 있다.
df3 = pd.DataFrame(data)
df3.loc[[0, 1, 5, 6, 10, 11, 15, 16], 'cnt2'] = np.nan
df3

cnt2_mean = df3['cnt2'].mean() # 93.5833333
df3['cnt2'] = df3['cnt2'].fillna(round(cnt2_mean)) #결측치가 채워짐
df

반응형