Data_Analysis_Track_33/Python

Python_Pandas_01-2(벡터화, Boolean 인덱싱, 주요 메소드, 정렬, (평균, 중앙값, 표준편차/분산, 최빈값, 분위수))

lsc99 2023. 9. 12. 21:22

벡터화 (연산)
- Pandas의 Series나 DataFrame은 연산을 하면 원소 단위로 연산을 한다.
    element-wise 연산 이라고도 한다.
- Series/DataFrame과 값(scalar값)을 연산하면 각 원소들과 값을 연산한다.
- Series끼리 또는 DataFrame끼리 연산을 하면 같은 위치의 원소끼리 연산을 한다.
    Index 이름이 (index가 아닌) 같은 원소끼리 연산한다.

 

s1 = pd.Series([10, 100, 50, 30])
s2 = pd.Series([100, 5, 10, 300])

s1과 s2 연산

s1 + 20 # Series + 상수(Scalar)
s1 - 100
# s1 > 50

 

s1 + s2 # Series끼리 연산 : 같은 index name의 원소끼리 연산
s1 > s2

 

s3 = pd.Series([1, 2, 3, 4, 5, 6])
s1 + s3 # size가 다른 Series 끼리 연산, 일치하지 않는 index끼리 계산결과 : NaN
# NaN -> 없다라는 의미(값을 모른다.)

 Index 이름이 다른 원소끼리 연산. (오류가 발생한다.)

s4 = pd.Series([10, 20, 30, 40], index = ['A', 'B', 'C', 'D'])
s4 > s1 # index name이 다르면 계산이 안된다.

Boolean 인덱싱
- Series의 indexing 연산자에 boolean 리스트를 넣으면 True인 index의 값들만 조회한다.
    원하는 조건의 값들을 조회할 때 사용한다.

논리연산자  설명
      &            and연산
       |             or연산
      ~             not 연산
- 논리연산자의 피연산자들은 반드시 ( )로 묶어준다.
- 파이썬과는 다르게 and, or, not은 예약어는 사용할 수 없다.

 

s1 = pd.Series([1, 2, 3, 4])
s1[[1, 3]] # 1, 3 index 조회 - fancy indexing
s1[[False, True, False, True]]
# 조회할 Series와 같은 크기(Shape)의 리스트. 조회할 index-True, 나머지 - False

난수를 가진 Series s2 생성

import numpy as np
s2 = pd.Series(np.random.randint(100, size = 100)) # 0 ~ 99 사이의 랜덤정수 100개로 구성된 배열(리스트)을 생성.

모든 값들에 대한 조건의 True, False 조회

s2 > 50

s2[s2 > 50]으로 원하는 조건의 index와 값 조회

# s2 에서 50 보다 큰 값들만 조회.
s2[s2 > 50] # boolean indexing - 원하는 조건의 값들만 조회.

연산자

# 30 < s2 <50 값들을 조회
# 30 < s2 < 50 : 파이썬에서는 가능하지만 판다스는 지원하지 않는다.
# s2 > 30 and s2 < 50 # 판다스는 and, ur를 지원하지 않는다.
                    # -> and > &, or -> l, 피연산자는 ()로 묶어준다.
(s2 > 30) & (s2 < 50)

원하는 조건의 index와 값 조회

s2[(s2 > 30) & (s2 < 50)] # 30~50의 조건에 충족하는 값들에만 True 부여 -> True 값들 출력

np.where -> 위치 조회

np.where((s2 > 30) & (s2 < 50)) # 조건이 True인 값의 위치(index)를 조회

or 연산자

s2[(s2 > 30) | (s2 < 70)]

not 연산자

s2[~((s2 > 30) & (s2 < 70))]

between

# Series.between(a,b) : a -b 사이의 값인지 여부를 bool 값으로 반환(a, b 포함)
s2[s2.between(10,50)]

주요 메소드

 

head() -> 앞의 n개를 조회

s2.head() # 앞에 n개를 조회 (default : 5)
s2.head(10)

tail() -> 뒤의 n개를 조회

s2.tail() # 뒤에 n개 조회(default : 5)
s2.tail(10)

dtype, shape, size

print("타입:", s2.dtype)
print("shape:", s2.shape) # 차원별 크기
print("원소개수:", s2.size)

astype() -> 타입 변경

# 타입을 변경
s2 = s2.astype("float32") # s2의 타입을 변경한 결과를 담은 새로운 Series를 반환 (deep copy 개념)

 

s2.dtype # 타입 변경 확인

value_counts() -> unique 값의 개수

s2.value_counts() # unique 값이 몇개 있는지 세는 함수
# index name : unique 값, value : 개수, normalize=True -> 비율로 나타낸다.

nunique() -> 고유값의 개수

s2.nunique() # 고유값의 개수 반환.

count() -> 결측치(null)를 제외한 값의 개수

s2.count() # 결측치(null)를 제외한 값의 개수

 

# 결측치값 : None, numpy.nan
s6 = pd.Series(["Python", "C++", None, "C++", "Python", None, "Java"])
print(s6.size) # 전체 원소의 개수(결측치 포함)
print(s6.count()) # 결측치를 제외한 원소의 개수
s6.value_counts() # 결측치 개수는 세지 않는다.

정렬
- sort_values()
    값으로 정렬
- sort_index()
    index명으로 정렬
- 공통 매개변수
    ascending=False (내림차순, 기본-True:오름차순)
    inplace=True
        원본 자체를 정렬
        False(기본값): 정렬결과를 새로운 Series로 반환.
    결측치(NaN)는 정렬 방식과 상관없이 마지막에 나온다.

 

s6.sort_index(ascending=False) # index 이름을 기준으로 정렬

값의 빈도수를 index명으로 정렬

s6.value_counts().sort_index()

평균, 중앙값, 표준편차/분산, 최빈값, 분위수

 

평균

s = pd.Series([10, 10, 20, 20, 30, 30])
s.mean() # 평균

중앙값

s2 = pd.Series([10, 10, 20, 20, 30, 30, 1000])
print("평균:", s2.mean())
print("중앙값:", s2.median())

표준편차

print("평균:", s.mean())
print("분산:", s.var())
print("표준편차:", round(s.std(), 2))

최빈값

s3 = pd.Series(list("aabcddcaaccdbbabcadccbdabcdabca"))
s3.nunique()

최빈값 : 빈도수(개수)가 제일 많은 값 - 범주형(분류기준으로 사용되는 값)의 대표값

s3.value_counts()

 

s3.mode() # Series로 반환. 두 개 이상일수도 있다.

최대, 최소값

s.min(), s.max()

 

최소값, 최대값이 있는 index를 반환

s.idxmin(), s.idxmax() # 최소값, 최대값이 있는 index를 반환

합계

s.sum() # 합계

통계량(수치형)

s.describe()
# 여러 통계량을 묶어서 반환.
# 수치형 : count-결측치 제외한 값의 개수.

통계량(문자열)

s3.describe()
# 문자열 : unique - 고유값의 개수(nunique()), top-최빈값(mode), freq : 최빈값의 개수

분위수

# 분위수
s2.quantile(q=0.5) # q : 분위 0 ~ 1 실수
s2.quantile(q=0.1) # 10분위의 1분위
s2.quantile(q=[0.3, 0.7, 0.8])

분위수의 자주 사용되는 형식 (4분위수)

s2.quantile(q=[0.25, 0.5, 0.75]) # 4분위수 구하기