[빅데이터/df/조건에 맞는 데이터 출력/그룹으로 나누기/새로운 열 만들기]

안지은·2022년 12월 18일
0
  1. value_counts(), sort_values()를 사용하여 타이타닉호 승객에 대해
  • 성별(sex) 인원수, 나이별(age) 인원수, 선실별(class) 인원수, 사망/생존(alive) 인원수를 구하라.

  • 전체의 평균나이, 여성승객의 평균나이, 1등실선실/여성의 평균나이

# csv 파일 읽기

import pandas as pd
import numpy as np
import seaborn as sns

df = sns.load_dataset('titanic')
df.head()

성별 인원수

# 성별 인원 수
print('성별\n', df['sex'].value_counts(), '\n')

성별
male 577
female 314

나이별 인원수

# 나이 별 인원 수
age_cnt = df['age'].value_counts()
print('나이    사람수')
for age, cnt in age_cnt.items():
    print(f'{age:7.2f}: {cnt}')

선실 별 인원 수

# 선실 별 인원 수
print('선실 별 인원 수:')
pclass_cnt = df['pclass'].value_counts()
for pclass, cnt in pclass_cnt.items():
    print(f'{pclass}등실: {cnt}')

선실 별 인원 수:
3등실: 491
1등실: 216
2등실: 184

사망/생존 인원 수

# 사망/생존 인원 수
print('사망/생존 인원 수')
survived_cnt = df['survived'].value_counts()
for survived, cnt in survived_cnt.items():
    print(f'{"생존" if survived else "사망"}:  {cnt}')

사망/생존 인원 수
사망: 549
생존: 342

전체 평균 나이

# 전체 평균 나이
avg_age = df['age'].dropna().mean()
print(f'전체 평균 나이: {avg_age:.1f} 세')

전체 평균 나이: 29.7 세

여성 승객 평균 나이(성별 조건문)

# 여성 승객의 평균 나이
female_age = df[df['sex']=='female']['age'].dropna()  #dropna():NaN 행은 제거
avg_female_age = female_age.mean()
print(f'여성 승객 평균 나이: {avg_female_age:.1f} 세')

여성 승객 평균 나이: 27.9 세

1등석 선실 여성의 평균 나이(조건문)

# 1등석 선실 여성의 평균 나이
female1c_age = df[(df['sex']=='female') & (df['pclass']==1)]['age'].dropna()
avg_female1c_age = female1c_age.mean()
print(f'1등석 여성 승객 평균 나이: {avg_female1c_age:.1f} 세')

1등석 여성 승객 평균 나이: 34.6 세

승객을 나이를 기준으로 그룹으로 나누기

  • 타이타닉호 승객을 '미성년자', '청년', '중년', '장년', '노년' 나이 그룹으로 나누어라.
    bins = [1, 20, 30, 50, 70, 100]
    labels = ['미성년자', '청년', '중년', '장년', '노년']
  • 그리고 각 나이 그룹의 승객 비율을 구한다. 비율의 전체 합은 1이 되어야 한다.
bins = [1, 20, 30, 50, 70, 100]
labels = ['미성년자', '청년', '중년', '장년', '노년']
categories = pd.cut(df['age'], bins, labels=labels)  #'age' 데이터를 그룹으로 나누기

age_categories = categories.value_counts().sort_index()  #index를 기준으로 열(col) 값 정렬
sum_passengers = sum(age_categories.values)  #각 그룹의 승객 수를 다 합함. = 전체 승객 수

check_calc = 0.0  #비율의 전체 합이 1인지 확인 
for cate, cnt in age_categories.items():
    p = cnt / sum_passengers  #(해당 그룹 승객 수) / (전체 승객 수)
    check_calc += p
    print(f'{cate:5s}:\t{cnt}\t{p * 100:.2f} %')
    
print(f'합계: {check_calc * 100.0:.2f} %')

미성년자 : 165 23.57 %
청년 : 230 32.86 %
중년 : 241 34.43 %
장년 : 59 8.43 %
노년 : 5 0.71 %
합계: 100.00 %

새로운 열을 만들기

  • 타이타닉호의 승객에 대해 나이와 성별에 의한 카테고리 열인 category3 열을 만들어라. category3 카테고리는 다음과 같이 정의된다.
  • 20살 미만이면 성별에 관계없이 "미성년자"라고 한다.
  • 20살 이상이면 나이에 따라 "청년", "중년", "장년", "노년"을 구분하고 그 뒤에 성별을 나타내는 "남성", "여성"을 붙인다.
bins2 = bins[1:]  #[20, 30, 50, 70, 100]
labels2 = labels[1:]  #['청년', '중년', '장년', '노년']

df['category3'] = categories  #categories:'age' 데이터를 그룹으로 나눈 상태

df['category3'] = df.apply(lambda x: '' if np.isnan(x.age)
                           else x.category3 if x.age < 20
                           else f'{x.category3} 남성' if x.sex == 'male'
                           else f'{x.category3} 여성', axis=1)
df

업로드중..

profile
공부 기록용

0개의 댓글