본문 바로가기
개발일지/Pandas

pandas (판다스) 기초3

by 다니엘의 개발 이야기 2022. 7. 15.
320x100
import pandas as pd

titanic = pd.read_csv('titanic.csv')
titanic
# 표현에 유의 하자
age.to_frame().info()
## Analyzing Numerical Series

# 결측치를 제외한 원소의 수를 세준다.

age.count()

# 714
# 전체길이는 891이다.
age.sum(skipna = True)

# 21205.17
# skipna = True 는 "결측치를 제외하고"라는 의미를 담고 있다.
# 즉, 결측치를 제외한 값에 대하여 sum 을 해줘라. 가 되겠다.
# 하지만 기본적으로 ()처럼 공백으로 하여도 다음과 같은 결과가 나오는 것을 보니 굳이 써줄 필요는 없을 것으로 보이기도 한다.
age.sum()

# 21205.17
# age 열에 들어있는 모든 원소의 합을 구한다.
sum(age)

# nan
# 하지만 내장함수인 sum()으로 age를 감싸주면 age의 결측치를 어떻게 처리할지 몰라서 nan값을 리턴한다.
# 이건 사소하다고 볼 수 있겠지만 중요한 부분 같다.
age.unique()

# 중복된 값을 제거하고 고유한 값 만을 순서대로 보여준다.
# 결측값인 nan도 하나의 고유한 값으로 포함된다.
# 따라서 길이는 89가 된다.
age.nunique()

# 88
# 위에서 unique로는 결측치를 포함하는 값이기 때문에 길이가 89가 나왔지만
# nunique는 결측치를 배제하고 고유한 값을 출력하는 것이기 때문에 88이 출력된다.
age.nunique(dropna = True)

# 위의 skipna와 같은 기능이다.
# 결측치를 버리고 갈지, 함께 포함하여 갈지를 정하는 것이다.
# 그렇기에 dropna가 False라면 값은 89가 나오게 된다.
age.value_counts()

# 각 고유 값들에 대한 절대도수를 가장 높은 도수부터 가장 낮은 순서대로 배열해준다.
# 절대도수는 해당 값에 대하여 몇개의 값이 있는지를 표현해주는 것으로 오른쪽에 표현되는 숫자이다.

'''
24.00    30
22.00    27
18.00    26
19.00    25
28.00    25
         ..
36.50     1
55.50     1
0.92      1
23.50     1
74.00     1
Name: age, Length: 88, dtype: int64
'''

# 맨위의 데이터를 해석하자면 24살의 승객이 30명이다.
# ***** 중요 *******
age.value_counts(normalize = True)

# 이렇게 하면 아래와 같은 값이 출력된다.

'''
24.00    0.042017
22.00    0.037815
18.00    0.036415
19.00    0.035014
28.00    0.035014
           ...   
36.50    0.001401
55.50    0.001401
0.92     0.001401
23.50    0.001401
74.00    0.001401
Name: age, Length: 88, dtype: float64
'''

# 아래와 같은 값은 "절대도수"가 아닌 "상대도수"로써
# 전체중에서 어느정도의 비율을 차지하고 있는지를 표현해주고 있는 것이다.
# 1이 100%라고 보면 된다.
30/age.size

# 0.03367003367003367
# 이런식으로 age의 사이즈를 30으로 나누어 줄 수도있다.
# ***** 매우매우매우매우 중요 *******
age.value_counts(ascending=True ,bins = 5)

# ascending 은 절대도수 혹은 상대도수의 위치에 해당하는 오른쪽 끝에 위치한 것을 기준으로 해서 True의 경우는 오름차순, False의 경우에는 내림차순
# 으로 진행되며
# bins 는 binary로써 각구간의 갯수를 말한다. 전체 구간을 여기서는 5개로 나누어 준다고 입력한 것이다.
# 따라서
# 64~ 80, 48~64, 0~ 16, 32~48, 16~32 처럼 지저분해보일 수 있겠지만, 절대도수의 갯수 배열대로 정렬이 되는것이기 때문에 결과값의 지저분함은
# 어쩔 수 없지만 구간이 5개로 나뉘었음을 볼 수 있다.

'''
(64.084, 80.0]       11
(48.168, 64.084]     69
(0.339, 16.336]     100
(32.252, 48.168]    188
(16.336, 32.252]    346
Name: age, dtype: int64
'''

 

## Analyzing non-numerical Series

summer = pd.read_csv('summer.csv')
summer
athlete.shape

# (31165,)
# 이것의 의미는 1차원 이라는 뜻이다.
athlete.describe

'''
<bound method NDFrame.describe of 0                    HAJOS, Alfred
1                 HERSCHMANN, Otto
2                DRIVAS, Dimitrios
3               MALOKINIS, Ioannis
4               CHASAPIS, Spiridon
                   ...            
31160           JANIKOWSKI, Damian
31161    REZAEI, Ghasem Gholamreza
31162               TOTROV, Rustam
31163            ALEKSANYAN, Artur
31164               LIDBERG, Jimmy
Name: Athlete, Length: 31165, dtype: object>

'''
# 전체적으로 이렇게 나열 형식이다.
# 정말 미세한 차이 같지만, 인사이트에 있어서 큰 차이를 만들어낸다.

athlete.describe()

'''
count               31165
unique              22762
top       PHELPS, Michael
freq                   22
Name: Athlete, dtype: object
'''

# freq는 Frequency의 약자이며, Frequency는 "빈도"를 뜻한다.
# 여기서는 Top 다음에 나왔기 때문에 가장 많이 "메달"을 수여한 사람은 PEHLPS, Michael 이 된다. 그리고 그가 수상한 횟수는 22회다.
# ****** 중요 *********

# 전체적으로 결측값이 있는지 없는지 확인할때

athlete.size
# 31165
# 결측치를 포함하여 athlete가 가지고 있는 모든 행과 열의 수를 리턴한다.

athlete.count()
# 31165
# 결측치를 배제하고 athlete가 가지고 있는 모든 행의 수를 리턴한다.

# 따라서 이렇게 2개를 두고 비교해서 결측치가 있는지 없는지 구별할 수가 있다.
athlete.value_counts()

# 가장 많이 등장하는 선수의 순서대로.
athlete.value_counts(normalize=True, bins = 6)

# TypeError: bins argument only works with numeric data.
# 숫자로 다루었을때, 구간 설정이 가능하다고 한다. 
# 절대도수, 상대도수는 아무래도 숫자다. 그런데 numeric이 아니라서 에러가 발생했다는 것은
# 그 구간의 기준이 될 필드가 string이면 안된다는 뜻. 숫자나 float여야 가능한것같다.
300x250

'개발일지 > Pandas' 카테고리의 다른 글

pandas 판다스 기초 5  (0) 2022.07.15
pandas 판다스 기초 4  (0) 2022.07.15
pandas(판다스) 기초 2  (0) 2022.07.14
pandas 기초1  (0) 2022.07.14
pymssql 설치에러 해결!  (0) 2022.07.08