IT/Python

Pandas(판다스) - 파이썬을 활용한 데이터 분석 기초 #7

디지털 은행원 이야기 2022. 10. 3. 13:24
반응형

Pandas

안녕하세요.

이번시간부턴 Pandas 와 관련된 다양한 함수에 대해 알아보도록 하겠습니다.

먼저 Pandas 에서 조건으로 검색을 하는것에 대해 알아보겠습니다.

 

파이썬의 특징 답게 간단한 조건을 검색하는것은 굉장히 직관적이고 단순합니다.

또한, query()라는 함수를 통해서도 동일한 결과를 얻을 수 있습니다.

아래의 예제를 통해 확인해보겠습니다.

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(5,2), columns=["A", "B"])
#        A        B
# 0  0.416760  0.417993
# 1  0.417333  0.010951
# 2  0.490884  0.335433
# 3  0.942838  0.114225
# 4  0.909844  0.214219

df["A"] < 0.5
# A 열에 있는 값 중 크기가 0.5보다 작은 값
# 0    True
# 1    True
# 2    True
# 3    False
# 4    False
# Name: A, dtype: bool

df[(df["A"] < 0.5) & (df["B"] > 0.3)]
# 0    True		0    True
# 1    True		1    False
# 2    True		2    True
# 3    False		3    False
# 4    False		4    False
# Name: A, dtype: bool  Name: B, dtype: bool

#         A        B
# 0 0.416760  0.417993
# 2 0.490884  0.335433

# 위의 결과를 나타낼 수 있는 함수로 query 가 있다.
df.query("A < 0.5 and B > 0.3")

# 문자열이라면 다른 방식으로도 조건 검색이 가능하다.

#      Animal   Name
# 0     Dog     Happy
# 1     Cat     Sam
# 2     Cat     Toby
# 3     Pig     Mini
# 4     Cat     Rocky

df["Animal"].str.contains("Cat")
df.Animal.str.match("Cat")
# 0     False
# 1     True
# 2     True
# 3     False
# 4     True
# Name: Animal, dtype: bool

 

함수를 통해 데이터를 검색해봤다면 이번엔 함수로 데이터를 처리해보도록 하겠습니다.

먼저 apply() 함수입니다. 행 또는 열 또는 전체의 셀(=원소)에 원하는 연산을 지원합니다.

numpy의 sqrt과 같이 단일 연산인 경우 전체에 적용되고

numpy의 min, max, average와 같이 집계되는 경우 사라질 축을 지정합니다.

행은 사라지고 열 단위로 집계하고 싶은 경우 axis = 0,

열은 사라지고 행 단위로 집계하고 싶은 경우 axis = 1으로 지정합니다.

df = pd.DataFrame(np.arange(5), columns=["Num"])

# square 함수 정의, x 값을 받아서 제곲된 값을 return
def square(x):
	return x**2

# apply로 컬럼에 함수 적용
df["Square"] = df["Num"].apply(Square)
#     Num   Square
# 0   0     0
# 1   1     1
# 2   2     4
# 3   3     9
# 4   4     16

# 함수 대신 람다 표현식으로도 적용 가능
df["Square"] = df.Num.apply(lambda x: x ** 2)
# 0   0     0
# 1   1     1
# 2   2     4
# 3   3     9
# 4   4     16
# Name: Num, dtype: int64

 

다음으로 데이터를 그룹으로 묶는것입니다.

단순한 집계뿐만 아니라 조건을 넣어 집계하고 싶은 경우도 사용 가능합니다.

아래의 예제를 통해 알아보겠습니다.

 

df = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C'],
				 'data1': [1, 2, 3, 1, 2, 3], 'data2': np.random.randint(0, 6, 6)})
#     data1     data2     key
# 0     1         3        A
# 1     2         0        B
# 2     3         1        C
# 3     1         4        A
# 4     2         4        B
# 5     3         5        C

df.groupby('key')
# <pandas.core.groupby.groupby.DataFrameGroupBy object at 0x10e3588>
# key 로 groupby를 하면 A, B, C가 각각 같은것끼리 묶입니다.

df.groupby('key').sum()
#     data1     data2
# key
#  A     2         7
#  B     4         4
#  C     6         6

df.groupby(['key', 'data1']).sum()
# key, data1로 groypby 를 한 후 sum
#                data2
# key  data1 
#  A     1         7
#  B     2         4
#  C     3         6

 

groupby를 통해 key 값별로 데이터를 묶을 수 있습니다.

아래의 예제는 groupby로 묶어놓은 데이터를 aggregate, filter를 사용해 응용하는 예제입니다.

aggregate 는 원하는 데이터만 추출하는것이고 filter는 말그대로 조건에 맞는 값만 필터링할때 사용합니다.

apply 역시 groupby를 통해 묶어놓은 데이터에 함수 적용이 가능한데 아래의 예제를 통해 확인해보겠습니다.

##### aggregate
#     data1     data2     key
# 0     0         4        A
# 1     1         4        B
# 2     2         6        C
# 3     3         0        A
# 4     4         6        B
# 5     5         1        C

# 데이터 프레임을 'key' 칼럼으로 묶고, data1과 data2 각각의 최솟값, 중앙값, 최댓값을 출력
df.groupby('key').aggregate(['min', np.median, max])
#     data1                       data2
#     min      median     max     min      median     max
# key
# 0     0       1.5        3        0       2.0        4
# 1     1       2.5        4        4       5.0        6
# 2     2       3.5        5        1       3.5        6

# 데이터 프레임을 'key' 칼럼으로 묶고, data1의 최솟값, data2의 합계를 출력
df.groupby('key').aggregate({'data1': 'min', 'data2': np.sum})
#     data1     data2
# key
#  A     0         4
#  B     1         10
#  C     2         7

##### filter
#     data1     data2     key
# 0     0         4        A
# 1     1         4        B
# 2     2         6        C
# 3     3         0        A
# 4     4         6        B
# 5     5         1        C

def filter_by_mean(x):
	return x['data2'].mean() > 3
    
df.groupby('key').mean()
#     data1     data2
# key
#  A   1.5       2.0 
#  B   2.5       5.0
#  C   3.5       3.5

df.groupby('key').filter(filter_by_mean)
#     data1     data2    key
#  1    1        4        B
#  2    2        6        C
#  4    4        6        B
#  5    5        1        C

##### apply
#     data1     data2     key
# 0     0         4        A
# 1     1         4        B
# 2     2         6        C
# 3     3         0        A
# 4     4         6        B
# 5     5         1        C

df.groupby('key').apply(lambda x: x.max() - x.min())
#     data1     data2
# key
#  A     3         4
#  B     3         2
#  C     3         5

 

이외에도 groupby로 묶인 데이터중에서 key값으로 데이터를 가져올 수 있는 get_group도 있습니다.

df.groupby("key1").get_group("key2")의 형태로 사용가능합니다.

 

마지막으로 MultiIndex입니다. MultiIndex는 인덱스를 계층적으로 만드는데 활용합니다.

df = pd.DataFrame(
	np.random.randn(4, 2),
    index=[['A', 'A', 'B', 'B'], [1, 2, 1, 2]],
    columns=['data1', 'data2']
)

#         data1         data2
# A  1   1.374474     0.883503
#    2   1.471934     -0.004420
# B  1   0.749019     1.263473
#    2   -1.302791    -0.969855

# 열 인덱스도 계층적으로 만들 수 있다.
df = pd.DataFrame(
	np.random.randn(4, 2),
    columns=[["A", "A", "B", "B"], ["1", "2", "1", "2"]]
)

#       A                           B
#              1            2              1            2
#   0   1.374474     0.883503       1.374474     0.883503
#   1   1.471934     -0.004420      1.374474     0.883503
#   2   0.749019     1.263473       1.374474     0.883503
#   3   -1.302791    -0.969855      1.374474     0.883503

 

df["A"] 는 형광색 동그라미 부분이고 df["A"]["1"] 은 빨간색 동그라미부분이 됩니다.

이러한 다중 인덱스 탐색의 경우에는 loc, iloc 역시 사용가능합니다.

 

이상 Pandas에 대한 기본적인 내용에 관해 학습해봤습니다.

다음으로는 Matplotlib에 관해 알아보도록 하겠습니다.

감사합니다.

반응형