[오늘의 문제] Pandas 심화

shlim55·2025년 11월 18일

코딩테스트

목록 보기
177/223

다이어트 실험 조건 분석

다이어트 중 지방 섭취 양, 행동 시간, 검사 중 상황에 따른 심박수를 조사한 데이터가 저장되어 있습니다. 지방 섭취 양이나 행동 시간 등에서 특정 조건과 일치하는 실험의 결과를 한눈에 파악하려고 합니다.

exercise.csv 파일에는 다이어트 중 지방 섭취 양, 행동 시간, 검사 중 상황에 따른 심박수를 조사한 데이터가 저장되어 있습니다.

데이터를 읽고, 아래 지시사항을 따르세요.

  1. 첫 번째 줄에 조건으로 비교할 컬럼의 이름을 입력받습니다.
  • 문자 형식으로 이루어진 컬럼만을 비교 대상으로 선택합니다.
  1. 두 번째 줄에 내용과 비교할 문자열을 입력받습니다.
  2. 불러온 csv 파일을 이용하여 첫 번째 줄에 입력받은 컬럼의 내용이 두 번째 줄에 입력받은 문자열과 일치하는 행 전체를 출력합니다.
  • 상위 20줄까지만 출력합니다.

입력 예시

diet
no fat

출력 예시

    id    diet  pulse    time     kind
15   6  no fat     83   1 min     rest
16   6  no fat     83  15 min     rest
17   6  no fat     84  30 min     rest
18   7  no fat     87   1 min     rest
19   7  no fat     88  15 min     rest
20   7  no fat     90  30 min     rest
21   8  no fat     92   1 min     rest
22   8  no fat     94  15 min     rest
23   8  no fat     95  30 min     rest
24   9  no fat     97   1 min     rest
25   9  no fat     99  15 min     rest
26   9  no fat     96  30 min     rest
27  10  no fat    100   1 min     rest
28  10  no fat     97  15 min     rest
29  10  no fat    100  30 min     rest
45  16  no fat     84   1 min  walking
46  16  no fat     86  15 min  walking
47  16  no fat     89  30 min  walking
48  17  no fat    103   1 min  walking
49  17  no fat    109  15 min  walking

내가 한 풀이

# 1. 첫 번째 줄에 조건으로 비교할 컬럼의 이름을 입력받습니다.
#   - 문자 형식으로 이루어진 컬럼만을 비교 대상으로 선택합니다.
import pandas as pd

data = pd.read_csv('exercise.csv')
df = pd.DataFrame(data)

column_name = input("컬럼의 이름을 입력하세요: ")


# 2. 두 번째 줄에 내용과 비교할 문자열을 입력받습니다.
str_input = input("비교할 문자열을 입력하세요: ")

# 3. 불러온 csv 파일을 이용하여 첫 번째 줄에 입력받은 컬럼의 내용이 두 번째 줄에 입력받은 문자열과 일치하는 행 전체를 출력합니다.
#   - 상위 20줄까지만 출력합니다.

filtered_df = df[df[column_name] == str_input]
filtered_df.head(20)

트러블 슈팅
df[df[column_name].str.contains(str_input)]
이 풀이는 틀린거임
df[df[column_name] == str_input]
이렇게 해야 입력받은 문자열과 일치하는 행 출력한다.

수면에 관한 설문조사

수면에 관한 설문 결과 데이터를 가지고 한 사람과 비슷한 수면 습관을 지니는 사람들을 찾아 분석해보려고 합니다.

sleep.csv 파일에 수면 설문 조사 결과 데이터가 담겨 있습니다.

함수 sleep()을 아래 내용을 참고하여 완성하세요.

  • 인덱스가 name에 해당하는 데이터를 찾습니다.
  • 해당 데이터와 PhoneTime, Tired, Breakfast 값이 일치하는 데이터를 추출합니다. (인덱스가 name인 본인 데이터도 포함됩니다.)
  • 추출한 데이터에서 Enough 값(Yes 혹은 No)에 대해 Hours 평균을 구한 후 그 값 사이의 차이를 구합니다. (절댓값 abs() 함수를 사용하세요.)
  • 반환되는 형태는 실수형이어야 합니다.

예시 호출

print(sleep(df, "Wendy"))

예시 결과

1.0

내가 한 풀이

import pandas as pd

# - 인덱스가 name에 해당하는 데이터를 찾습니다.
# - 해당 데이터와 PhoneTime, Tired, Breakfast 값이 일치하는 데이터를 추출합니다. (인덱스가 name인 본인 데이터도 포함됩니다.)
# - 추출한 데이터에서 Enough 값(Yes 혹은 No)에 대해 Hours 평균을 구한 후 그 값 사이의 차이를 구합니다. (절댓값 abs() 함수를 사용하세요.)
# - 반환되는 형태는 실수형이어야 합니다.
def sleep(df, name): # name 대상 습관자의 이름 
    person = df.loc[name] # loc 써서 추출하기, 인덴스가 Wendy인 데이터를 추출해서 저장
    # person(Wendy)에서 PhoneTime, Tired, Breakfast를 추출 
    # 여기서도 person 활용해보기 person['PhoneTime'] 이렇게
    person_pt = df.loc[name, "PhoneTime"] 
    person_tired = df.loc[name, "Tired"] 
    person_bf = df.loc[name, "Breakfast"] 

    # 추출한 person의 각 정보와 원본 데이터와 비교해서 person(Wendy)과 수면 습관이 일치하는 사람을 조회 
    people = df.loc[(df["PhoneTime"] == person_pt) & (df["Tired"] == person_tired) & (df["Breakfast"] == person_bf)]

    # 추출한 데이터에서 Enough값에 대한 평균을 각각(Yes 혹은 No) 구한다
    #  people[people['Enough'] == 'Yes']['Hours'].mean()
    yes_mean = people[people['Enough'] == 'Yes']['Hours'].mean()
    no_mean = people[people['Enough'] == 'No']['Hours'].mean()

    # 그리고 그 값들의 차이를 구함
    result = no_mean - yes_mean
    return abs(result)

# 데이터셋을 읽으세요.
df = pd.read_csv('sleep.csv', index_col=0) # 0번째 컬럼을 인덱스로 쓰겠다

print(sleep(df, 'Wendy')) # 예시 호출

다른 사람의 풀이

person = df.loc[name]

# 여기서도 person 활용해보기 person['PhoneTime'] 이렇게

person_pt = df.loc[name, "PhoneTime"] 
person_tired = df.loc[name, "Tired"] 
person_bf = df.loc[name, "Breakfast"] 


 # 추출한 person의 각 정보와 원본 데이터와 비교해서 person(Wendy)과 수면 습관이 일치하는 사람을 조회 
people = df.loc[(df["PhoneTime"] == person_pt) & (df["Tired"] == person_tired) & (df["Breakfast"] == person_bf)]


# 추출한 데이터에서 Enough값에 대한 평균을 각각(Yes 혹은 No) 구한다

# people[people['Enough'] == 'Yes']['Hours'].mean()
 이렇게 써야 함 

yes_mean = (people["Enough"] == "Yes").mean()
no_mean = (people["Enough"] == "No").mean() 


# 그리고 그 값들의 차이를 구함
    result = no_mean - yes_mean
    return abs(result)![]

yes_mean = people[people['Enough'] == 'Yes']['Hours'].mean()
no_mean = people[people['Enough'] == 'No']['Hours'].mean()
mean 함수 활용, Enough값이 Yes or No인 사람의 평균 시간 구하기
이 요구사항을 캐치 못함

혈압 분류하기

데이터를 활용하여 건강보험 가입자의 혈압을 분류하려 합니다.

blood_pressure.csv 파일에 혈압에 대한 정보가 담겨 있습니다.

컬럼	        예시 
가입자 일련번호	    1
수축기 혈압	      127
이완기 혈압	      79

함수 total()을(를) 아래 내용을 참고하여 완성하세요.


혈압분류	 수축기혈압	  이완기혈압	 조건
정상	    120미만	    80미만	    그리고
주의	    120~129	   80미만	   그리고
고혈압 전단계  130~139	 80~89	    또는
고혈압 1기	  140~159	90~99	   또는
고혈압 2기	  160이상	 100이상     또는
  1. 데이터프레임 형태의 혈압 데이터와 ‘혈압 분류’를 매개변수로 받습니다.
  2. 해당 ‘혈압 분류’에 해당하는 사람의 수를 출력합니다.
  3. 함수 반환값은 정수입니다.

예시 호출

print(total(df, "정상"))

예시 출력

73

내가 한 풀이

import pandas as pd
# 1. 데이터프레임 형태의 혈압 데이터와 ‘혈압 분류’를 매개변수로 받습니다.
def total(df, s):
    if s == '정상': #  120미만	    80미만	    그리고
        df = df[(df["수축기 혈압"] < 120) & (df["이완기 혈압"] < 80 )]
    elif s == '주의': # 주의	    120~129	   80미만	   그리고
        df = df[((df["수축기 혈압"] >= 120) & (df["수축기 혈압"] <= 129)) & (df["이완기 혈압"] < 80 )] # Pandas 에서는 범위 연산이 먹히지 않음! -> 풀어서 작성해야 함 
    elif s == '고혈압 전단계': # 130~139	 80~89	    또는
        df = df[((df["수축기 혈압"] >= 130) & (df["수축기 혈압"] <= 139)) | ((df["이완기 혈압"] >= 80) & (df["이완기 혈압"] <= 89))]
    elif s == '고혈압 1기': # 고혈압 1기	  140~159	90~99	   또는
        df = df[((df["수축기 혈압"] >= 140) & (df["수축기 혈압"] <= 159)) | ((df["이완기 혈압"] >= 90) & (df["이완기 혈압"] <= 99))]
    elif s == '고혈압 2기': # 고혈압 2기	  160이상	 100이상     또는
        df = df[(df["수축기 혈압"] >= 160) | (df["이완기 혈압"] >= 100)]
    return len(df)

# 2. 해당 ‘혈압 분류’에 해당하는 사람의 수를 출력합니다.


# 3. 함수 반환값은 정수입니다.
# 데이터셋을 읽으세요.
df = pd.read_csv('blood_pressure.csv')

print(total(df, '정상')) # 예시 호출

피드백
판다스에선 범위 연산자가 안 먹는다 각각 () 쳐야 함 명제마다

굳이 120~129사이 명제에서 괄호 한번 더 안 묶어줘도 된다 그리고 130미만이라 표현하는것도 좋음

elif s == '주의': # 주의        120~129    80미만      그리고
        df = df[((df["수축기 혈압"] >= 120) & (df["수축기 혈압"] <= 129)) & (df["이완기 혈압"] < 80 )] # Pandas 에서는 범위 연산이 먹히지 않음! -> 풀어서 작성해야 함 ![]

데이터 수정

한 식당에서 한 달간 판매한 메뉴와 평균별점을 가진 데이터프레임(df)을 생성하고 이를 수정하려고 합니다.

	메뉴명	가격(원)	주문횟수	평균별점
0	돌솥비빔밥	13000	14	3.3
1	제육볶음	15000	55	4.5
2	고등어구이	16000	21	4.7
3	낙지볶음	16000	48	1.2
4	김치찌개&달걀말이	21000	30	4.9
  1. 위 표대로 데이터프레임을 생성하세요.
  2. 낙지볶음의 평균별점을 실수(float)로 입력받습니다.
  3. 입력받은 값으로 낙지볶음의 평균별점을 변경합니다.
  4. 출력 예시를 참고하여 낙지볶음 의 메뉴명과 가격, 주문횟수, 평균별점을 데이터프레임 형태로 출력하세요.
  5. 단, 평균별점이 5.0을 초과하면 아래의 Error 메세지 를 출력합니다.

입력 예시

4.5

출력 예시

    메뉴명  가격(원)  주문횟수  평균별점
3  낙지볶음  16000    48   4.5

입력 예시

8.5

출력 예시

별점은 5점까지 입니다!

내가 한 풀이

import pandas as pd 

# 0. 위 표대로 데이터프레임을 생성하세요.
data = {
    '메뉴명': ['돌솥비빔밥', '제육볶음', '고등어구이', '낙지볶음', '김치찌개&달걀말이'],
    '가격(원)': [13000, 15000, 16000, 16000, 21000],
    '주문횟수': [14, 55, 21, 48, 30],
    '평균별점': [3.3, 4.5, 4.7, 1.2, 4.9]
}

df = pd.DataFrame(data)
df
# 1.  낙지볶음의 평균별점을 실수(float)로 입력받습니다.
# avg_point = df.groupby(["메뉴명"])["평균별점"].mean()
# 낙지볶음의 평균과  변수에 할당
# octo_avg_point = avg_point.loc["낙지볶음"]
# 2. 입력받은 값으로 낙지볶음의 평균별점을 변경합니다.
octo_avg_point = 4.3 # 이부분을 인풋으로 변경하기 float(input())
# df
# 3. 출력 예시를 참고하여 낙지볶음의 메뉴명과 가격, 주문횟수, 평균별점을 데이터프레임 형태로 출력하세요.
# df.iloc[[3], :] # 리스트를 사용하여 DataFrame으로 유지

# 4. 단, 평균별점이 5.0을 초과하면 아래의 Error 메세지 를 출력합니다.
# 1. 5.0을 초과하는 행을 선택합니다.
# error_rows = df[df["평균별점"] > 5.0]


if octo_avg_point > 5.0:
    print("별점은 5점까지 입니다!")
else: 
    # print(df[df['메뉴명'] =='낙지볶음'])
    print(df.iloc[[3], :] )
# if octo_avg_point <= 5.0:
#     df.iloc[3, 3] = octo_avg_point
#     print(df[df['메뉴명'] =='낙지볶음'])

위에 평균 별점 구하는 코드문도 사실상 필요 없다하고
평균별점 입력 및 판별-> 5.0이하일시 출력 이렇게만 하면 됨!

피드백대로 수정한 풀이

import pandas as pd 

# 0. 위 표대로 데이터프레임을 생성하세요.
data = {
    '메뉴명': ['돌솥비빔밥', '제육볶음', '고등어구이', '낙지볶음', '김치찌개&달걀말이'],
    '가격(원)': [13000, 15000, 16000, 16000, 21000],
    '주문횟수': [14, 55, 21, 48, 30],
    '평균별점': [3.3, 4.5, 4.7, 1.2, 4.9]
}

df = pd.DataFrame(data)
df
# 1.  낙지볶음의 평균별점을 실수(float)로 입력받습니다.
# avg_point = df.groupby(["메뉴명"])["평균별점"].mean()
# 낙지볶음의 평균과  변수에 할당
# octo_avg_point = avg_point.loc["낙지볶음"]
# 2. 입력받은 값으로 낙지볶음의 평균별점을 변경합니다.
octo_avg_point = 4.3 # 이부분을 인풋으로 변경하기 float(input())
# df
# 3. 출력 예시를 참고하여 낙지볶음의 메뉴명과 가격, 주문횟수, 평균별점을 데이터프레임 형태로 출력하세요.
# df.iloc[[3], :] # 리스트를 사용하여 DataFrame으로 유지

# 4. 단, 평균별점이 5.0을 초과하면 아래의 Error 메세지 를 출력합니다.
# 1. 5.0을 초과하는 행을 선택합니다.
# error_rows = df[df["평균별점"] > 5.0]


if octo_avg_point > 5.0:
    print("별점은 5점까지 입니다!")
else: 
    df.iloc[3, 3] = octo_avg_point
    print(df.iloc[[3], :] )
# if octo_avg_point <= 5.0:
#     df.iloc[3, 3] = octo_avg_point
#     print(df[df['메뉴명'] =='낙지볶음'])

꽃 종류 정렬

iris.csv 파일을 pandas 라이브러리를 이용하여 불러옵니다. 파일 내의 컬럼에 대한 설명은 다음과 같습니다.

  • sepal_length: 꽃받침 길이
  • sepal_width: 꽃받침 너비
  • petal_length: 꽃잎 길이
  • petal_width: 꽃잎 너비
  • species: 꽃의 종류
  1. 첫 번째 줄에 출력을 시작할 행 번호를 입력받습니다.
  2. 두 번째 줄에 출력을 종료할 행 번호를 입력받습니다.
  3. 세 번째 줄에 정렬할 기준의 컬럼 이름을 입력받습니다.
  4. 불러온 csv 파일을 이용하여 세 번째 줄에 입력받은 컬럼 명을 기준으로 하여 오름차순으로 정렬합니다.
  5. 정렬한 데이터를 첫 번째 줄에 입력받은 행 번호부터 두 번째 줄에 입력받은 행 번호까지의 행을 출력합니다.

입력 예시

1
5
sepal_length

출력 예시

    sepal_length  sepal_width  petal_length  petal_width species
42           4.4          3.2           1.3          0.2  setosa
38           4.4          3.0           1.3          0.2  setosa
8            4.4          2.9           1.4          0.2  setosa
41           4.5          2.3           1.3          0.3  setosa

import pandas as pd

df = pd.read_csv('iris.csv')

1. 첫 번째 줄에 출력을 시작할 행 번호를 입력받습니다.

df

start_num = int(input("출력을 시작할 행 번호: "))

2. 두 번째 줄에 출력을 종료할 행 번호를 입력받습니다.

end_num = int(input("출력을 종료할 행 번호: "))

3. 세 번째 줄에 정렬할 기준의 컬럼 이름을 입력받습니다.

col_name = input("정렬할 기준의 컬럼 명: ")

4. 불러온 csv 파일을 이용하여 세 번째 줄에 입력받은 컬럼 명을 기준으로 하여 오름차순으로 정렬합니다.

df = df.sort_values(col_name, ascending=True)

5. 정렬한 데이터를 첫 번째 줄에 입력받은 행 번호부터 두 번째 줄에 입력받은 행 번호까지의 행을 출력합니다.

df.iloc[start_num:end_num, :]

피드백
굳이 , : 는 안 넣어도 된다.

서울시 지역구별 혼인이혼 통계 데이터 병합

인구수 데이터가 seoul_population.csv에 저장이 되어있습니다.

혼인/이혼 건수 데이터가 seoul_marriage_divorce_data.csv에 저장이 되어있습니다.

  1. 위 데이터를 각각 df1과 df2 이름으로 데이터를 읽어오세요.
  2. 서울시 혼인 및 이혼 건수 데이터에 잘못된 값이 저장되어 있었습니다.
  • loc 또는 iloc을 활용하여 df2의 마포구의 혼인 건수를 1520으로 변경하세요.
  1. 서울시 인구수 데이터와 혼인/이혼 데이터를 하나의 데이터로 합치려합니다. 지역구를 기준으로 두 데이터를 합쳐 ans_df에 저장하세요. (행 및 열의 순서는 자유롭게 설정하세요)
  2. 합쳐진 데이터프레임을 출력합니다.

내가 한 풀이

import pandas as pd

# 0. 위 데이터를 각각 df1과 df2 이름으로 데이터를 읽어오세요.
df1 = pd.read_csv('seoul_population.csv')
df2 = pd.read_csv('seoul_marriage_divorce_data.csv')

# 1. 서울시 혼인 및 이혼 건수 데이터에 잘못된 값이 저장되어 있었습니다. 
#   - loc 또는 iloc을 활용하여 df2의 마포구의 혼인 건수를 1520으로 변경하세요.
df2.loc[(df2["지역구"] == '마포구'), "혼인"] = 1520

# 2. 서울시 인구수 데이터와 혼인/이혼 데이터를 하나의 데이터로 합치려합니다. 지역구를 기준으로 두 데이터를 합쳐 ans_df에 저장하세요. (행 및 열의 순서는 자유롭게 설정하세요)
ans_df = pd.merge(df1, df2, on="지역구", how="inner")# 일치하는 행끼리만 병합

# 3. 합쳐진 데이터프레임을 출력합니다.
ans_df

피드백
어떤 컬럼값 기준 병합이라면 merge 사용
굳이 df2.loc[(df2["지역구"] == '마포구'), "혼인"] = 1520
에서 굳이 ()안써도 됨

서울시 인구데이터 까지 교집합방식을써야 한다면 이론상 inner 방식 선호
일치하는 행끼리만 병합![]

부상자수 구하기

accident.csv 파일에 가해운전자의 연령층 및 월별 교통사고 통계 정보가 담겨있습니다.

컬럼	예시
가해자연령층 20세이하
발생월	    01
사고건수	363
사망자수	4
중상자수	95
경상자수	368
부상신고자수 46

accident.csv를 읽고 아래 지시사항을 수행하세요.

  1. 부상자수 칼럼을 아래처럼 fillna()을 활용하여 채우세요.
  • 부상자수는 중상자수, 경상자수 그리고 부상 신고자수를 더한 값입니다.
  1. 부상자수 컬럼을 정수형으로 변경하세요.
  2. 기존의 모든 칼럼을 포함하여 데이터프레임을 출력합니다.

내가 한 풀이

import numpy as np
import pandas as pd

# 데이터를 읽으세요.
info = pd.read_csv('accident.csv')

# [수정금지] 부상자수 컬럼 생성 후, 모든 값을 NaN(결측값)으로 설정
info['부상자수'] = np.nan

# 지시사항을 수행하세요.

# 1. 부상자수 칼럼을 아래처럼 fillna()을 활용하여 채우세요.
#   - 부상자수는 중상자수, 경상자수 그리고 부상 신고자수를 더한 값입니다.
info['부상자수'] = info['부상자수'].fillna(info['중상자수'] + info['경상자수'] + info['부상신고자수']).astype(int)

# 2. 부상자수 컬럼을 정수형으로 변경하세요.
# info['부상자수'] = info['부상자수'].astype(int)

# 3. 기존의 모든 칼럼을 포함하여 데이터프레임을 출력합니다.
print(info)

트러블 슈팅 및 피드백

대체하기 방식 - fillna방식 사용하기

info['부상자수'] = info['부상자수'].fillna(int(0))


info['부상자수'] = info['부상자수'].fillna(info['중상자수'] + info['경상자수'] + info['부상신고자수'])

이렇게 수정해야 함

info['부상자수'] = info['부상자수'].fillna(info['중상자수'] + info['경상자수'] + info['부상신고자수'])
# 2. 부상자수 컬럼을 정수형으로 변경하세요.
info['부상자수'] = info['부상자수'].astype(int)

이 두개 코드문을 더 간추리자면

info['부상자수'] = info['부상자수'].fillna(info['중상자수'] + info['경상자수'] + info['부상신고자수']).astype(int)![]

장르별 인기 있는 웹툰들 알아보기

어떤 사이트에서는 웹툰이 정기적으로 연재 중입니다. 이 사이트에 연재된 웹툰들의 데이터를 보고 장르별 인기 웹툰을 확인해보려고 합니다.

webtoon.csv 파일에 어떤 사이트에 연재된 웹툰들에 대한 데이터가 담겨 있습니다.

컬럼	의미	예시
Name	웹툰 제목	Pyramid Game
Writer	웹툰 작가	Dalgonyak
Likes	좋아요 수	720233
Genre	장르	Drama
Rating	별점	9.53
Subscribers	구독자 수	173800

함수 best()를 아래 내용을 참고하여 완성하세요.

매개변수는 다음과 같습니다.

  • df: 웹툰에 대한 정보가 담긴 데이터 (데이터프레임)
  • g: 알고 싶은 장르 (문자열)
  1. 주어진 df에서 장르가 g인 웹툰들에 대해 "Rating" 값이 가장 높은 데이터들을 데이터프레임 형태로 반환합니다.
  2. 해당 장르에서 Rating 값이 가장 높은 데이터는 한 개 이상입니다.
  • 즉, Rating 값이 가장 높은 데이터가 여러 개인 경우에는 모두 출력해야 합니다
  1. 단, 반환되는 데이터프레임은 기존의 모든 칼럼을 포함해야 합니다.
  2. 반환되는 형태는 데이터프레임이어야 합니다.

예시 호출

print(best(df, "Romance"))

예시 출력

                        Name                    Writer    Likes    Genre  Rating  Subscribers
324  See You in My 19th Life                   Lee Hey  5100000  Romance    9.89       945200
294       Seasons of Blossom         HONGDUCK / NEMONE  3200000  Romance    9.89       584900
323   My Gently Raised Beast  Yeoseulki / Early Flower  2300000  Romance    9.89       804700

내가 한 풀이

import pandas as pd

def best(df, g):
    # df에서 장르가 g와 일치하는 행만을 필터링하고, 평점(Rating) 기준으로 내림차순 정렬하는 코드를 작성하세요
    sorted_df = df.loc[df['Genre'] == g].sort_values("Rating", ascending=False)
    # sorted_df = df[df['Genre'] == g].sort_values("Rating", ascending=False)

    # 정렬된 데이터프레임의 첫 번째 행(가장 높은 평점)의 평점을 first 변수에 저장하는 코드를 작성하세요
    first = sorted_df.iloc[0, 4] # df.iloc[0]['Rating'] 이렇게도 표현 가능 
    # df.iloc[0] -> 첫번째 행 추출
    # ['Rating'] 그 하나의 행 중에서 'Rating' 컬럼 값 추출

    # 평점이 가장 높은 웹툰들만 필터링하여 df를 업데이트하는 코드를 작성하세요
    df = sorted_df.loc[sorted_df["Rating"] == first, : ] # first의 평점과 같은 평점의 웹툰들을 추출 

    return df

# 데이터를 읽으세요.
df = pd.read_csv('webtoon.csv')

# sorted_df = df.loc[df['Genre'] == "Romance"].sort_values("Rating", ascending=False)

# 정렬된 데이터프레임의 첫 번째 행(가장 높은 평점)의 평점을 first 변수에 저장하는 코드를 작성하세요
# first = sorted_df.iloc[0, :]
# print/(first) # Seasons of Blossom의 Rating인 9.89를 추출하기 
print(best(df, "Romance")) # 예시 호출
df = sorted_df.loc[sorted_df["Rating"] == first, : ] # first의 평점과 같은 평점의 웹툰들을 추출 

여기서도 굳이.loc 안해도 된다 함

loc하는 방식 행,열 둘다 입력 받아야할때 쓴다고 한다.

df = sorted_df.loc[sorted_df["Rating"] == first, : ] # first의 평점과 같은 평점의 웹툰들을 추출

여기서도 , : 빼도 됨 ![]

사고의 피해에 따른 교통사고 유형 찾기

도로교통공단에서 제공한 유형별 교통사고에 대한 데이터를 활용하여 유형별로 사고의 피해를 비교해보려고 합니다.

accident.csv 파일에 유형별 교통사고의 통계가 담겨있습니다.

컬럼	예시
사고유형대분류	차대사람
사고유형중분류	보도통행중
사고건수	2188
사망자수	45
중상자수	1005
경상자수	1239
부상신고자수	121

함수 danger()를 아래 내용을 참고하여 완성하세요.

  1. 매개변수 받기
  • df: 데이터프레임 형태의 교통사고 통계 데이터
  • n: 알고 싶은 사고 당 피해의 순위
  1. 주어진 df에 '사고당피해'라는 칼럼을 추가합니다. 이때 '사고당피해'의 값은 전체 사상자수를 사고건수로 나눈 값입니다. 사상자수는 사망자수, 중상자수, 경상자수, 부상신고자수를 모두 포함합니다.
  2. 사고 당 피해의 순위가 n인 사고의 사망자수와 중상자수의 합을 구하여 반환합니다.
  3. 반환되는 형태는 정수형이어야 합니다.

예시 호출

print(danger(df, 1))

예시 출력

4250

내가 한 풀이

import pandas as pd

# 1. 매개변수 받기
#   - df: 데이터프레임 형태의 교통사고 통계 데이터
#   - n: 알고 싶은 사고 당 피해의 순위
# 2. 주어진 df에 '사고당피해'라는 칼럼을 추가합니다. 이때 '사고당피해'의 값은 전체 사상자수를 사고건수로 나눈 값입니다. 사상자수는 사망자수, 중상자수, 경상자수, 부상신고자수를 모두 포함합니다.
# 3. 사고 당 피해의 순위가 n인 사고의 사망자수와 중상자수의 합을 구하여 반환합니다.
# 4. 반환되는 형태는 정수형이어야 합니다.

def danger(df, n):
    # DataFrame에 '전체'라는 새로운 열을 추가하는 코드를 작성하세요
    # 이 열은 사망자수, 중상자수, 경상자수, 부상신고자수의 합을 나타냅니다.
    df['전체'] = df['사망자수'] + df['중상자수'] + df['경상자수'] + df['부상신고자수']

    # DataFrame에 '사고당피해'라는 새로운 열을 추가하는 코드를 작성하세요
    # 이 열은 전체 피해자 수를 사고건수로 나눈 값을 나타냅니다
    df['사고당피해'] = (df['사망자수'] + df['중상자수'] + df['경상자수'] + df['부상신고자수']) / df['사고건수'] # 전체 컬럼 활용 df['전체']

    # DataFrame을 '사고당피해' 열의 값에 따라 내림차순으로 정렬하는 코드를 작성하세요
    df = df.sort_values("사고당피해", ascending=False)

    # 정렬된 DataFrame에서 n번째 행을 선택하는 코드를 작성하세요
    result = df.iloc[n - 1]# 여기서도 ,: 빼도 됨 

    # 선택된 행의 '사망자수'와 '중상자수'를 합산하여 반환하는 코드를 작성하세요
    return result['사망자수'] + result['중상자수']

# 데이터를 읽으세요!
df = pd.read_csv('accident2.csv')
print(df)
print(danger(df, 1)) # 예시 호출

피드백

df['사고당피해'] = (df['사망자수'] + df['중상자수'] + df['경상자수'] + df['부상신고자수']) / df['사고건수'] # 전체 컬럼 활용 df['전체']


# 정렬된 DataFrame에서 n번째 행을 선택하는 코드를 작성하세요
    result = df.iloc[n - 1, :]

여기서도 ,: 빼도 됨 ![]

profile
A Normal Programmer

0개의 댓글