Pandas 에서도 다양한 집계함수를 제공하고 있습니다.
집계함수는 각 함수들의 사용법을 이해하는 것보다 데이터의 집계 방향을 이해하고 분석하고자 하는 데이터에 맞게 활용하는 것이 더 중요합니다.
DataFrame에 저장되어 있으면? Pandas의 집계함수
NDArray에 저장되어 있으면? NumPy의 집계함수
<실습코드>
import pandas as pd
import numpy as np
# 실습 데이터 생성
score = {'sub1': [3, 9, 1, 1, 9],
'sub2': [2, 9, np.nan, np.nan, 8],
'sub3': [np.nan, 1, 5, 5, 7],
'sub4': [np.nan, 3, np.nan, 1, np.nan]}
df = pd.DataFrame(data=score)
print(df)
'''
count() 집계함수 실습
'''
print('\n#1 Count Function')
print(df.count())
'''
count 함수에 axis=1 인자 추가한 실습
'''
print('\n#2 Count Function with axis=1')
print(df.count(axis=1))
'''
sum() 집계함수 실습
'''
print('\n#3 Sum Function')
print(df.sum())
'''
sum() 함수에 skipna=False 인자 추가한 실습
'''
print('\n#4 Sum Function with skipna')
print(df.sum(skipna=False))
<실행결과>
sub1 sub2 sub3 sub4
0 3 2.0 NaN NaN
1 9 9.0 1.0 3.0
2 1 NaN 5.0 NaN
3 1 NaN 5.0 1.0
4 9 8.0 7.0 NaN
#1 Count Function
sub1 5
sub2 3
sub3 4
sub4 2
dtype: int64
#2 Count Function with axis=1
0 2
1 4
2 2
3 3
4 3
dtype: int64
#3 Sum Function
sub1 23.0
sub2 19.0
sub3 18.0
sub4 4.0
dtype: float64
#4 Sum Function with skipna
sub1 23.0
sub2 NaN
sub3 NaN
sub4 NaN
dtype: float64
데이터 그룹화 과정은
원본 데이터를 특정 그룹별로 나누어(split),
의미있는 연산을 적용한 뒤(apply),
그룹별 연산 최종 결과를(combine) 확인하는
일련의 프로세스를 가집니다.
다양한 상황과 조건에 따라 groupby 함수를 활용하는 법이 있습니다.
<실습코드>
import pandas as pd
import numpy as np
# 실습 데이터 생성
sample = {'product':['a','b','a','b','a','b','a','a'],
'sensor':['s1','s1','s2','s3','s2','s2','s1','s3'],
'x':np.arange(1,9),
'y':np.arange(5,13)}
df = pd.DataFrame(data=sample)
print(df)
'''
product 컬럼 기준으로 그룹화하기
'''
print('\n#1 groupby-product')
grouped_product = df.groupby('product')
print(grouped_product)
'''
grouped_product 에 저장된 key와 value 출력하기
'''
print('\n#2 key & value')
for key, value in grouped_product:
print("-----------------------")
print("key :", key)
print("value :\n", value)
'''
groupby 결과에 집계함수 적용하기
'''
print('\n#3 groupby-product')
grouped_product = df.groupby('product').sum()
print(grouped_product)
'''
product, sensor 기준으로 그룹화하기
'''
print('\n#4 groupby-product,sensor')
grouped_product = df.groupby(['product','sensor'])
print(grouped_product)
'''
그룹화한 뒤 x 컬럼에 대해서만 집계함수 적용하기
'''
print('\n#5 groupby-product,sensor')
grouped_product = df.groupby(['product','sensor'])['x'].sum()
print(grouped_product)
'''
그룹화한 뒤 컬럼별 다른 집계함수 적용하기
'''
print('\n#6 groupby-product,sensor')
condition = {'x':'max', 'y':'min'}
grouped_product = df.groupby(['product','sensor']).agg(condition)
print(grouped_product)
<실행결과>
product sensor x y
0 a s1 1 5
1 b s1 2 6
2 a s2 3 7
3 b s3 4 8
4 a s2 5 9
5 b s2 6 10
6 a s1 7 11
7 a s3 8 12
#1 groupby-product
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7f0779353b80>
#2 key & value
-----------------------
key : a
value :
product sensor x y
0 a s1 1 5
2 a s2 3 7
4 a s2 5 9
6 a s1 7 11
7 a s3 8 12
-----------------------
key : b
value :
product sensor x y
1 b s1 2 6
3 b s3 4 8
5 b s2 6 10
#3 groupby-product
x y
product
a 24 44
b 12 24
#4 groupby-product,sensor
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7f078bd7e4c0>
#5 groupby-product,sensor
product sensor
a s1 8
s2 8
s3 8
b s1 2
s2 6
s3 4
Name: x, dtype: int64
#6 groupby-product,sensor
x y
product sensor
a s1 7 5
s2 5 7
s3 8 12
b s1 2 6
s2 6 10
s3 4 8
pd.concat(objs, axis, join)
<실습코드>
import pandas as pd
# 실습 데이터 생성
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']},
index=[8, 9, 10, 11])
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
'D': ['D2', 'D3', 'D6', 'D7'],
'F': ['F2', 'F3', 'F6', 'F7']},
index=[2, 3, 6, 7])
print('DF1')
print(df1)
print('\nDF2')
print(df2)
print('\nDF3')
print(df3)
print('\nDF4')
print(df4)
'''
df2, df1 합치기
'''
print('\n#1 Concat df2, df1')
result = pd.concat([df2,df1, df3], ignore_index=True)
print(result)
'''
shape 이 서로 다른 df1, df4 합치기
'''
print('\n#2 Concat df1, df4')
result = pd.concat([df1,df4])
print(result)
'''
슬라이싱을 통해 일부 데이터 합치기
'''
print('\n#3 Concat df1, df4 by slicing')
result = pd.concat([df1[:2],df4[3:]])
print(result)
'''
행 기준으로 df1, df4 합치기
'''
print('\n#4 Concat df1, df4 by axis=1')
result = pd.concat([df1,df4], axis=1, ignore_index=True)
print(result)
'''
교집합으로 데이터 결합하기
'''
print('\n#5 Concat df1, df4 by join=inner')
result = pd.concat([df1,df4], join='inner')
print(result)
<실행결과>
DF1
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
DF2
A B C D
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
DF3
A B C D
8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
DF4
B D F
2 B2 D2 F2
3 B3 D3 F3
6 B6 D6 F6
7 B7 D7 F7
#1 Concat df2, df1
A B C D
0 A4 B4 C4 D4
1 A5 B5 C5 D5
2 A6 B6 C6 D6
3 A7 B7 C7 D7
4 A0 B0 C0 D0
5 A1 B1 C1 D1
6 A2 B2 C2 D2
7 A3 B3 C3 D3
8 A8 B8 C8 D8
9 A9 B9 C9 D9
10 A10 B10 C10 D10
11 A11 B11 C11 D11
#2 Concat df1, df4
A B C D F
0 A0 B0 C0 D0 NaN
1 A1 B1 C1 D1 NaN
2 A2 B2 C2 D2 NaN
3 A3 B3 C3 D3 NaN
2 NaN B2 NaN D2 F2
3 NaN B3 NaN D3 F3
6 NaN B6 NaN D6 F6
7 NaN B7 NaN D7 F7
#3 Concat df1, df4 by slicing
A B C D F
0 A0 B0 C0 D0 NaN
1 A1 B1 C1 D1 NaN
7 NaN B7 NaN D7 F7
#4 Concat df1, df4 by axis=1
0 1 2 3 4 5 6
0 A0 B0 C0 D0 NaN NaN NaN
1 A1 B1 C1 D1 NaN NaN NaN
2 A2 B2 C2 D2 B2 D2 F2
3 A3 B3 C3 D3 B3 D3 F3
6 NaN NaN NaN NaN B6 D6 F6
7 NaN NaN NaN NaN B7 D7 F7
#5 Concat df1, df4 by join=inner
B D
0 B0 D0
1 B1 D1
2 B2 D2
3 B3 D3
2 B2 D2
3 B3 D3
6 B6 D6
7 B7 D7