안녕하세요.
이번시간부턴 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에 관해 알아보도록 하겠습니다.
감사합니다.
'IT > Python' 카테고리의 다른 글
Matplotlib - 파이썬을 활용한 데이터 분석 기초 #8 (5) | 2022.10.08 |
---|---|
Pandas(판다스) - 파이썬을 활용한 데이터 분석 기초 #6 (0) | 2022.09.27 |
Pandas(판다스) - 파이썬을 활용한 데이터 분석 기초 #5 (2) | 2022.09.26 |