https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html
a = df.groupby('year'): 하면 year을 기준으로 그룹화한 'DataFrameGroupBy'객체 반환. => 집계 기준이 인덱스가 됨 => 다양한 집계 함수를 사용하면, 그 인덱스 기준으로 집계가 이루어짐.a = df.groupby('year')['lifeExp'].mean(): 이렇게 집계 함수를 걸면, 데이터타입이 다시 DataFrame으로 되고, 시각화도 된다.a = df.groupby(['year', 'continent'])['lifeExp'].mean(): 2개 기준을 순서대로 개층화. 여전히 1개의 컬럼이므로 => 시리즈. 인덱스는 (year, continent)의 튜플들. a = df.groupby(['year', 'continent'])['lifeExp', gdpPercap']].mean() => 2개 기준 계층화, 2개 열 추출. a.reset_index() => 그룹으로 계층화됐을 때, 계층 구조 없애기. (dropna=False)를 지정하면, 그 행도 포함된다. default는 제외. as_index=False는, 그룹화 기준열인 sex를 인덱스로 사용하지 않는다는 뜻. groupedDf.groups: 속성 사용하면, 각 그룹에 속한 데이터프레임 인덱스 확인 가능.
groupedDf.get_group('Female') => sex로 나눈 그룹에서 Female만 들고 온다.grouped_mean.loc['Female']과 같다.grouped.get_group(('First', 'female')) => 만약 class, sex로 2개의 기준열로 그룹화를 했을 때는, 이렇게 튜플이 인덱스가 되기 때문에 이렇게 지정.grouped_mean.loc['First'].loc['Female']과 같다.grouped_mean.loc[('First','Female')]도 같다. grouped = titanic1.groupby(['class', 'sex'])
grouped_mean = grouped.mean()
#1
grouped_mean.loc['First']
#혹은
grouped_mean.loc[('First',)]
#2
grouped_mean[grouped_mean['class'] == 'First']
grouped_mean[grouped_mean.index.get_level_values('class') == 'First']grouped_mean.loc[(slice(None), 'First'), :] 이런 식으로 두 번째 인덱스에만 접근 가능하다. slice는 iterable에서 슬라이싱을 하는 함수이고, 안에 None을 넣으면 :와 같은 의미로 그냥 모든 것이 된다. 즉 첫 번째 인덱스는 모두, 두 번째 인덱스는 First. .reset_index(). 인덱스 초기화하고, 처음부터 다시 준다. 그룹화된 객체는 인덱스가 그룹 기준으로 되어있고, DataFrameGroupBy 객체인데, 이를 통해 인덱스를 다시 부여하면 평탄화되면서 DataFrame 객체가 된다. df.describe(): 기본적인 기술통계.value_counts(): 시리즈에서 고유한 값들의 빈도를 반환.df['country'].value_counts():시리즈에서 고유한 값들의 빈도를 반환. country에서 각 값이 몇 번씩 나왔는지. df['열이름'].mean(): 시리즈의 평균값np.mean(df[열이름]). df[열이름]이 들어가는 위치에, df[열이름1]*df[열이름2]처럼 연산 넣으면, 그 결과값의 평균 반환.np.average(): 도 평균. 계산 시에 weights=1/df[열이름]처럼 가중치 입력 가능.numeric_only = True하면 DF 전체에 수인 열에만 적용. 나머지는 제외. df['열이름'].median(): 시리즈의 중앙값.np.median(df['열이름']df['열이름'].min(): 시리즈의 최소값np.min(['열이름'])df['열이름'].max(): 시리즈의 최대값np.max(df['열이름'])df['열이름'].quantile([], interpolation='linear'): 시리즈의 분위수. 숫자는 0.3 이런 식으로, interpolation은 보간법 지정. linear, midpoint, nearest, lower, higher 등.np.quantile(df['열이름'], method=) 여기선 method가 interpolation. np가 pd보다 더 다양한 방법 지원한다.np.percentile(df['열이름'], [0~100])df['열이름'].var(ddf=): 시리즈의 분산. ddof=1은 자유도. ddof 는 degree of freedom correction으로 자유도보정. 표본 데이터에 대한 추정치에 얼마나 자유도 보정할지. 디폴트가 1(즉, n-1로 계산해서 마지막 1의 샘플 추정). 0으로 하면, 모집단 분산 추정치 사용.np.var(df['열이름'], ddof=)df['열이름'].std(): 시리즈의 표준편차np.std(df['열이름'])df['열이름'].mode(): 시리즈의 최빈값values, count = np.unique(df['열이름'], return_counts=True) 고유값 리스트를 return한다. return_counts=True로 하면, 그 갯수도 세서 리스트에 리턴한다. np.argmax([시리즈]): 주어진 배열의 최댓값의 인덱스를 반환. df.groupby('a').size(): 그룹별로 사이즈 크기를 계산. 그냥 시리즈의 경우 크기를 반환. df.value_counts(): 데이터 프레임에서 각 값의 경우의 수가 모두 어떻게 나왔는지. 앞부터 순서대로 계층화해서.df.groupby('continent')['country'].value_counts() continent로 그룹화된 열 country의 행의 갯수를 셈. 



agg()는 Pandas 내장이 아닌 방식으로 groupby에 집계를 할 때 이용. 사용자 정의, 넘파이 함수, 기존 메서드의 사용자 응용 등을 적용할 수 있음.df.groupby('year')['lifeExp'].agg([사용자 정의 함수, np.mean()])df.groupby('year').agg({'lifeExp':['mean', 'sum'], 'gdpPercap':'median'})agg_mean_diff = df.groupby('year')['lifeExp'].agg(my_mean_diff, diff_value = global_mean)welfare.groupby('age').agg(mean_income = ('income', 'mean'))원본

agg는 그룹화된 걸 그룹별로 집계 함수를 적용해서, 그룹화된 채로 나온다.

transform은 그룹화된 것을 포함해서 계산을 하지만, 그걸 개별행에 적용. 여기서는 평균, 표준편차를 이용한 z-score를 개별적으로 비교.

# 결측값을 랜덤으로 만들기. re.random Module 참고.
np.random.seed(42)
tips_10 = sns.load_dataset('tips').sample(10)
tips_10.loc[
np.random.permutation(tips_10.index)[:4], 'total_bill'
] = np.NaN
# 함수 정의
def fill_na_mean(x):
avg = x.mean()
return x.fillna(avg)
# groupby로 채워넣기
total_bill_group_mean = (tips_10.groupby('sex')['total_bill'].transform(fill_na_mean))
total_bill_group_mean = (tips_10['total_bill'].transform(fill_na_mean))tips_filtered = (tips.groupby('size').filter(lambda x: x['size'].count() >= 30))
