욱이의 냉철한 공부

[Python, 정리] Pandas - 데이터 그룹연산 본문

데이터분석/Python : Basic

[Python, 정리] Pandas - 데이터 그룹연산

냉철한 욱 2022. 3. 28. 08:12

 

1. GroupBy

=> 그룹연산 : Split 분리 - Apply 적용 - Combine 결합

그룹의 색인은 다양한 형태가 될 수 있으며, 모두 같은 타입일 필요도 없다.

. 그룹으로 묶을 축과 같은 길이의 리스트나 배열

. DataFrame의 칼럼 이름을 지칭하는 값

. 그룹으로 묶을 값과 그룹 이름에 대응하는 사전이나 Series 객체

. 축 색인 혹은 색인 내의 개별 이름에 대해 실행되는 함수

 

df = DataFrame({'key1' : ['a', 'a', 'b', 'b', 'a'],

'key2' : ['one', 'two', 'one', 'two', 'one'],

'data1' : np.random.randn(5),

'data2' : np.random.randn(5)})

 

1.

grouped = df['data1'].groupby(df['key1'])

grouped.mean()

2.

means = df['data1'].groupby([df['key1'], df['key2']]).mean()

means

3.

states = np.array(['Ohio', 'California', 'California', 'Ohio', 'Ohio'])

years = np.array([2005, 2005, 2006, 2005, 2006])

df['data1'].groupby([states, years]).mean()

4.

df.groupby('key1').mean() : key2는 숫자데이터가 아니기 때문에 결과에서 제외

df.groupby(['key1', 'key2']).mean()

df.groupby(['key1', 'key2']).size()

 

 

 

2. GroupBy - 그룹 간 순회하기

- 그룹 이름과 그에 따른 데이터 묶음을 튜플로 반환한다.

1.

for name, group in df.groupby('key1'):

print(name)

print(group)

2.

for (k1, k2), group in df.groupby(['key1', 'key2']):

print((k1, k2))

print(group)

3.  사전형으로 바꿔서 인덱싱 할 수 있다.

pieces = dict(list(df.groupby('key1')))

pieces['b']

4.

grouped = df.groupby(df.dtypes, axis=1)

dict(list(grouped))

 

 

 

3. GroupBy - 색인 : 칼럼 또는 칼럼의 일부만 선택하기.

- df[['data2']].groupby([df['key1'],df['key2']]).mean()

 

- df.groupby(['key1', 'key2'])[['data2']].mean() : 포맷이 데이터프레임이다.

 

- s_grouped = df.groupby(['key1', 'key2'])['data2'] : 포맷이 시리즈이다.

 

s_grouped.mean()

 

 

 

4. GroupBy - 색인 : 사전과 Series에서 묶기.

- 사전

people = DataFrame(np.random.randn(5, 5), columns=['a', 'b', 'c', 'd', 'e'], index=['Joe', 'Steve', 'Wes', 'Jim', 'Travis'])

 

people.ix[2:3, ['b', 'c']] = np.nan # Add a few NA values

mapping = {'a': 'red', 'b': 'red', 'c': 'blue', 'd': 'blue', 'e': 'red', 'f' : 'orange'}

 

by_column = people.groupby(mapping, axis=1)

by_column.sum()

 

- Series

map_series = Series(mapping)

people.groupby(map_series, axis=1).count()

 

 

 

 

5. GroupBy - 색인 : 함수로 묶기

-

people.groupby(len).sum()

-

key_list = ['one', 'one', 'one', 'two', 'two']

people.groupby([len, key_list]).min()

 

 

 

 

6. GroupBy - agg

=> 자신만의 데이터 집계 함수를 사용하려면 배열의 agg나 aggregate 메서드에 해당 함수를 넘기면 된다.

 

df = DataFrame({'key1' : ['a', 'a', 'b', 'b', 'a'], 'key2' : ['one', 'two', 'one', 'two', 'one'], 'data1' : np.random.randn(5), 'data2' : np.random.randn(5)})

 

1.

def peak_to_peak(arr):

return arr.max() - arr.min()

 

grouped = df.groupby('key1')

grouped.agg(peak_to_peak)

 

2.

grouped.describe()

 

 

 

 

 

7. GroupBy - 칼럼에 여러 가지 함수 적용하기

=> 칼럼에 따라 다른 함수를 사용해서 집계를 수행하거나 여러 개의 함수를 한 번에 적용

 

grouped = tips.groupby(['sex', 'smoker'])

 

1. 기본

grouped_pct = grouped['tip_pct']

grouped_pct.agg('mean')

 

2. 여러 개의 함수 하나의 칼럼에 적용

grouped_pct.agg(['mean', 'std', peak_to_peak])

 

3. 여러 개의 함수 하나의 칼럼에 적용 - 이름 바꾸기

grouped_pct.agg(['mean', 'std', peak_to_peak])

 

4. 여러 개의 함수 여러 칼럼에 적용

functions = ['count', 'mean', 'max']

result = grouped['tip_pct', 'total_bill'].agg(functions)

result

result['tip_pct']

 

5. 여러 개의 함수 여러 칼럼에 적용 - 이름 바꾸기

ftuples = [('Durchschnitt', 'mean'), ('Abweichung', np.var)]

grouped['tip_pct', 'total_bill'].agg(ftuples)

 

6. 여러 개의 함수 각 칼럼 마다 다르게 적용

=> 사전 이용

grouped.agg({'tip' : np.max, 'size' : 'sum'})

grouped.agg({'tip_pct' : ['min', 'max', 'mean', 'std'], 'size' : 'sum'})

 

7. 색인되지 않은 형태로 집계된 데이터 반환

tips.groupby(['sex', 'smoker'], as_index=False).mean()

=> as_index = False

 

 

 

8. GroupBy - 그룹별 연산 APPLY

=> 분리 - 적용 - 병합

=> 객체를 여러 조각으로 나누어 전달된 함수를 각 조각에 일괄적으로 적용한 후 이를 다시 합치게 된다.

 

def top(df, n=5, column='tip_pct'):

return df.sort_index(by=column)[-n:]

 

tips.groupby('smoker').apply(top)

tips.groupby(['smoker', 'day']).apply(top, n=1, column='total_bill')

-

tips.groupby('smoker', group_keys=False).apply(top)

=> gruoup_keys=False : 그룹 색인 생략하기

 

 

 

 

 

 

9. 피벗테이블 - GroupBy를 편리하게

1.

tips.pivot_table(index=['sex', 'smoker'])

 

2.

tips.pivot_table(['tip_pct', 'size'], index=['sex', 'day'], columns='smoker')

 

3. margins = True 는 합산값 구하기

tips.pivot_table(['tip_pct', 'size'], index=['sex', 'day'], columns='smoker', margins=True)

 

4. aggfunc=len 은 len 함수 적용하기, 디폴트는 mean이다

tips.pivot_table('tip_pct', index=['sex', 'smoker'], columns='day', aggfunc=len, margins=True)

 

5. fll_value = 0 비어 있는 곳은 0 집어 넣기.

tips.pivot_table('size', index=['time', 'sex', 'smoker'], columns='day', aggfunc='sum', fill_value=0)