[EDA] mini project 11 _ 박물관

jaam._.mini·2024년 1월 12일
0
post-thumbnail

[🚫] Json -> Dataframe

  • json 파일을 그대로 csv로 불러와 만들려 했으나 실패 ~



[⭐] null 값 확인 꿀팁

  • 참고
    # Heatmap으로 null 값 얼마나 있는지 확인
    import seaborn as sns
    
    sns.heatmap(df_target.isnull(), yticklabels=False, cbar=False, cmap='viridis')



[🙄] 변경할 데이터만 null -> 0

  • 오답

    df_target = df_target.fillna(0)
     df_target.head(2)
  • 정답

    def fillNa(df_target, nullData):
        df_target[nullData].fillna(0, inplace=True)
        
    for column in type_int_col:
        fillNa(df_target, column)
        
    for column in type_float_col:
        fillNa(df_target, column)



[⭐] 특정 요소의 위치 파악 [index] 함수

리스트.index(찾고싶은 값)

리스트에 그 값이 존재한다면 그 값의 index를 돌려 줌

  • column.drop 에 사용

  • [오답] 이라고 뜸

    # 이상치로 판단되는 행(row) 삭제
    for column in type_int_col:
    # 10원 단위로 안떨어질때
        df_target.drop((df_target[column] % 10 != 0).index)
    # 십만원 이상인 경우
        df_target.drop((df_target[column] >= 100000).index)

  • [정답]을 찾음 : 교집합
    inplace=True

    for column in type_int_col:
        df_target.drop(df_target[(df_target[column] % 10 != 0) | (df_target[column] >= 100000)].index, inplace=True)

[⭐] python 중복 행 제거 + 1개만 남기기

참고

  1. 모든 열을 기준으로 중복 제거
    df.drop_duplicates()

  2. 지정한 열을 기준으로 중복 제거
    df.drop_duplicates(['Num'])

  3. 남길 대상 지정

    1) 첫번째만 남기기 (default)

      df.drop_duplicates(['Num'], keep = 'first')
    

    2) 마지막만 남기기

    df.drop_duplicates(['Num'], keep = 'last')

    3) 모두 제거

      df.drop_duplicates(['Num'], keep = False)
    
  4. 인덱스 재설정 (Reset index)

    1) 중복을 제거한 후에는 사라진 행의 인덱스가 비게 된다.

    df.drop_duplicates(['Num'])

    2) 이때 ignore_index 옵션을 이용하면 인덱스를 재설정해줄 수 있다.

    df.drop_duplicates(['Num'], ignore_index = True)

    3) 또는 reset_index() 메서드를 활용해서 같은 결과를 볼 수 있다.

    df = df.drop_duplicates(['Num'])
    df.reset_index(drop=True)
    

데이터 준비

Target Data(Json): 전국박물관미술관정보표준데이터

참고사항

  • 공공데이터포털에서 해당 데이터는 다양한 Format(xls, xml, json, rdf, csv)으로 제공합니다.
  • 다양한 Data Format 사용을 하고자 해당 Test에서는 일부러 json format의 데이터를 사용할 예정입니다.
  • 문제에 hint가 있을 경우, 해당 hint를 이용하지 않으셔도 무방합니다.

내 답

문제 1-1) Json Data로 Pandas DataFrame 만들기 (10점)

  • 위에서 읽은 json_data는 아래와 같이 구성되어있습니다. 이를 참고하여 pandas dataframe으로 불러오세요.
    • json_data
      • json_data['fields']: List. 각 variable은 하나의 Column(열)을 의미하며, {id: Column(열)명}의 형식으로 구성 되어있습니다.
      • json_data['records']: List. 각 variable은 하나의 Row(행)을 의미하며, {Column(열)명: data}의 형식으로 구성 되어있습니다.
    • 조건1: 위의 내용을 참고하여 'json_data'를 이용하여 Pandas DataFrame을 만드세요
    • 조건2: json data의 Index와 Column(열)의 순서(order)는 변경하지 마세요.
      • 앞에서부터 순차적으로 차례로 읽어 그대로 DataFrame으로 만드세요.
    • 조건3: 'df_target' 변수에 결과 DataFrame을 할당하세요.
# 모듈
import json

# json 파일 열기
with open('./datas/전국박물관미술관정보표준데이터.json', 'r', encoding='utf-8') as f:
    json_data = json.load(f)
# jason key 값들 확인
json_data.keys()
# json (fields) 확인
json_data['fields']
# json (records) 확인
json_data['records']
# fields key 값에서 데이터 뽑아 for문을 이용해 컬럼명만 출력, 컬럼 name으로 사용할 리스트 만들기
json_columnList = []
for key in json_data['fields']:
    for keys, value in key.items():
        json_columnList.append(value)

json_columnList
# records value 값에서 데이터 뽑아 for문을 이용해 컬럼명만 출력, 컬럼 name으로 사용할 리스트 만들기
json_valueList = []

for value in json_data['records']:
    value_datas = list(value.values())
    json_valueList.append(value_datas)

json_valueList
# 모듈
import pandas as pd

# 데이터 프레임 만들기
df_target = pd.DataFrame(data=json_valueList, columns=json_columnList)
df_target.head(2)

문제 2-1) 기초 전처리 01 (5점)

  • 1단계의 DataFrame(df_target)을 아래의 조건에 맞게 변경하세요.
    • 해당 json_data의 null값은 ""로 구성되어 df_target.info() 또는 df_target.isna() 등을 이용하여 null값을 확인할 경우 null값이 없다고 나오게 됩니다. 이에 이 Data를 제대로 확인하기 위해서 "" 대신에 Null값을 넣으려 합니다.
    • 조건1: ""(또는 '')는 띄어쓰기 없이 쌍따옴표(혹은 따옴표)로만 구성됩니다.
    • 조건2: ""(또는 '')를 null값(None)으로 바꾸세요.
    • 조건3: Index 또는 순서(order)는 변경하지 마세요.
    • 조건4: 'df_target' 변수에 결과 DataFrame을 할당하세요.
df_target.info()
# "" -> null 값으로 바꾸기
for i in range(0, len(df_target)):
    for j in range(0, len(json_columnList)):
        if df_target.iloc[i,j] == '':
            df_target.iloc[i,j] = None

문제 2-2) 기초 전처리 02 (5점)

  • 2-1의 DataFrame(df_target)을 아래의 조건에 맞게 변경하세요.
    • json Data를 Pandas DataFrame으로 만들면서 수치형 데이터들이 string으로 인식되었습니다. 이를 변경하려고 합니다.
    • 조건1: 아래 type_int_col의 Column(열) Data를 정수(int)형 Data로 변경하세요.
    • 조건2: 아래 type_float_col의 Column(열) Data를 실수(float)형 Data로 변경하세요.
    • 조건3: 변경할 Data에 Null값이 있다면, 0으로 채우세요.
    • 조건4: Index 또는 순서(order)는 변경하지 마세요.
    • 조건5: 'df_target' 변수에 결과 DataFrame을 할당하세요.
# int 로 변경
type_int_col = ['어른관람료', '청소년관람료', '어린이관람료']

df_target[type_int_col] = df_target[type_int_col].astype(int)

# float로 변경
type_float_col = ['위도', '경도']

df_target[type_float_col] = df_target[type_float_col].astype(float)
# null 값 -> 0으로 채우기
def fillNa(df_target, nullData):
    df_target[nullData].fillna(0, inplace=True)
    
for column in type_int_col:
    fillNa(df_target, column)
    
for column in type_float_col:
    fillNa(df_target, column)

df_target.head(2)

문제 2-3) 기초 전처리 03 (5점)

  • 2-2의 DataFrame(df_target)을 아래의 조건에 맞게 변경하세요.
    • 분석과 상관 없는 Column(열)의 Data들을 삭제하여 Data의 가독성을 높이고자 합니다.
    • 조건1: 아래 drop_col의 Column(열) Data를 삭제하세요.
    • 조건2: Index 또는 순서(order)는 변경하지 마세요.
    • 조건3: 'df_target' 변수에 결과 DataFrame을 할당하세요.
drop_cols = ['소재지지번주소', '위도', '경도', '운영기관전화번호','운영기관명', '운영홈페이지', '편의시설정보', '휴관정보', 
            '관람료기타정보', '박물관미술관소개', '교통안내정보', '관리기관전화번호', '관리기관명', '제공기관코드', '제공기관명']

df_target = df_target.drop(columns=drop_cols)
df_target 

문제 2-4) 기초 전처리 04 (5점)

  • 2-3의 DataFrame(df_target)을 아래의 조건에 맞게 변경하세요.
    • 어른, 청소년, 어린이 관람료가 이상한 경우, 해당 row(행) data 자체가 이상하다고 판단하여 삭제하고자 합니다.
    • 조건1: 관람료와 관련된 Column(열)은 위에서 정의한 type_int_col 입니다.
    • 조건2: 관람료가 10원 단위로 나누어 떨어지지 않는 경우 이상치로 판단합니다. 해당 row(행)를 삭제하세요.
    • 조건3: 관람료가 100000원(십만원) 이상인 경우 이상치로 판단합니다. 해당 row(행)를 삭제하세요.
    • 조건4: Index 또는 순서(order)는 변경하지 마세요.
    • 조건5: 'df_target' 변수에 결과 DataFrame을 할당하세요.
# # 이상치로 판단되는 행(row) 삭제
# for column in type_int_col:
# # 10원 단위로 안떨어질때
#     df_target.drop((df_target[column] % 10 != 0).index)
# # 십만원 이상인 경우
#     df_target.drop((df_target[column] >= 100000).index)


for column in type_int_col:
    df_target.drop(df_target[(df_target[column] % 10 != 0) | (df_target[column] >= 100000)].index, inplace=True)

문제 3-1) 심화 전처리 01 (10점)

  • 2단계의 DataFrame(df_target)을 아래의 조건에 맞게 변경하세요.
    • 휴관중이거나 중복된 박물관/미술관의 data를 삭제하고자 합니다.
      • 아래의 조건 이외에도 중복되는 data들이 있으나, 해당 Test에서는 아래 조건에 따른 중복 data만 삭제하여 진행합니다.
    • 조건1: 시설명 Column(열) data에 '휴관'이라는 글자가 들어있으면 해당 row(행)은 삭제합니다.
    • 조건2: 시설명 Column(열) data가 중복되는 경우 해당 row(행)의 '데이터기준일자'가 최신인 data를 남기고 최신이 아닌 row(행)은 삭제합니다.
      • 만약, 시설명 Column(행)의 data가 중복되면서 가장 최신인 data가 두 개 이상인 경우, Index가 가장 낮은(예시: 495, 674 중 495) Index를 남기고, 높은 Index(예시: 495, 674 중 674)의 row(행) data를 삭제하세요.(낮은 인덱스가 더 최근 데이터라고 가정)
    • 조건3: 시설명 Column(열) data의 중복 여부는 시설명 Column(열) data의 띄어쓰기를 삭제한 값이 일치할 경우 중복된 박물관/미술관으로 판단합니다.
    • 조건4: Index 또는 순서(order)는 변경하지 마세요.
      • 문제를 풀기위해 순서를 변경하였다면, 다시 Index 순서로 정렬하세요
    • 조건5: 'df_target' 변수에 결과 DataFrame을 할당하세요.
    • hint1: '데이터기준일자' Column(열)의 Data는 현재 string입니다. 대소비교가 가능한지 확인해보세요.
    • hint2: 조건2 관련하여, '시설명'과 '데이터기준일자'가 같은 data들이 존재합니다. Index를 확인하세요.
      • '데이터기준일자' 기준으로 정렬시 주의하세요.
# 시설명[휴관] 해당 행 삭제

# pandas dataframe에서 제공되는 iterrows() 메서드를 이용해 row를 순회
# column / row를 Series 단위로 읽기 때문에, for range로 도는것보다 빠름
# 데이터프레임의 행을 하나씩 반복해서 얻고 싶을 때는 df.iterrows()를 사용
for idx, row in df_target.iterrows():
    column_name = '시설명'

    # 휴관이라는 말이 있다면 삭제
    # 불안하니까, 다른 변수 주기
    if '휴관' in row[column_name]:
        df_target = df_target.drop(idx)
# 데이터기준일자 중복 시 최신 1개만 남기고 삭제
# [참고] https://blog.naver.com/devim-/222747469542
df_target.sort_values(by='데이터기준일자', ascending=False)
df_target = df_target.drop_duplicates(['시설명'], keep = 'first') 
# 시설명 뽑아보기
df_target['시설명'].unique()
# .str. 을 붙여 프라움 악기박물관도 붙이기
df_target['시설명'] = df_target['시설명'].str.replace(" ", "")
df_target['시설명'].unique()
df_target = df_target[~df_target['시설명'].str.replace(' ', '').duplicated()]
# df_target.sort_values(by='시설명', ascending=False)
# df_target = df_target.drop_duplicates(['시설명'], keep = 'first') 
df_target

문제 3-2) 심화 전처리 02 (10점)

  • 3-1의 DataFrame(df_target)을 아래의 조건에 맞게 변경하세요.
    • 평일과 공휴일에 박물관/미술관이 하루 중 몇시간이나 열려있는지를 알려주는 '관람가능시간'을 구하려고 합니다.
    • 조건1: 평일의 관람가능시간은 '평일관람시작시각'부터 '평일관람종료시각'까지 입니다. '평일관람가능시간' Column(열)을 만들어 평일의 관람가능시간을 입력하세요.
    • 조건2: 공휴일의 관람가능시간은 '공휴일관람시작시각'부터 '공휴일관람종료시각'까지 입니다. '공휴일관람가능시간' Column(열)을 만들어 공휴일의 관람가능시간을 입력하세요.
    • 조건3: '평일관람가능시간'과 '공휴일관람가능시간'은 시간(hour) 단위 실수(float)로 표기합니다.
      • 관람가능시간이 8시간 30분인경우 8.5로 표기합니다.
      • 관람가능시간이 23시간을 초과하는 경우 24시간으로 표기합니다.
      • 평일 또는 공휴일의 관람시작시각과 관람종료시각이 모두 00:00(또는 0:00)인 경우 휴일로 판단하며, 관람가능시간은 0으로 입력합니다.
      • 관람가능시간이 6시간 40분과 같이 무환소수(6.6666666666666......6666666667)로 표기될 경우 소숫점 셋째 자리에서 반올림하여 소숫점 둘째 자리까지 표기합니다.
    • 조건4: Index 또는 순서(order)는 변경하지 마세요.
    • 조건5: 'df_target' 변수에 결과 DataFrame을 할당하세요.
df_target_temp = df_target.copy()

time_cols = ['평일관람시작시각', '평일관람종료시각', '공휴일관람시작시각', '공휴일관람종료시각']

for idx, row in df_target_temp[time_cols].iterrows():
    open_hour, open_min = map(int, row.평일관람시작시각.split(':'))
    close_hour, close_min = map(int, row.평일관람종료시각.split(':'))
    total = (close_hour - open_hour) + round((close_min - open_min) / 60, 2)
    df_target_temp.loc[idx, '평일관람가능시간'] = 24 if total > 23 else total

    open_hour, open_min = map(int, row.공휴일관람시작시각.split(':'))
    close_hour, close_min = map(int, row.공휴일관람종료시각.split(':'))
    total = (close_hour - open_hour) + round((close_min - open_min) / 60, 2)
    df_target_temp.loc[idx, '공휴일관람가능시간'] = 24 if total > 23 else total

df_target_temp

문제 3-3) 심화 전처리 03 (10점)

  • 3-2의 DataFrame(df_target)을 아래의 조건에 맞게 변경하세요.
    • '소재지도로명주소' Column(열)의 Data를 가공하여 광역자치단체-기초자치단체(행정시)-상세 주소로 구분하려고 합니다.
    • 조건1: '소재재도로명주소' Column(열) data의 첫번째 단어는 언제나 광역자치단체명을 의미합니다. '광역' Column(열)을 만들어 해당 row(행) data의 광역자치단체명을 입력하세요.
      • '세종특별시'는 현재 '세종특별자차시'로 명칭이 변경되었습니다. 이를 반영해주세요.
    • 조건2: '소재재도로명주소' Column(열) data의 두번째 단어는 대부분 기초자치단체명을 의미합니다. '기초' Column(열)을 만들어 해당 row(행) data의 기초자치단체명을 입력하세요.
      • '제주특별자치도'의 경우 기초자치단체가 없으나, 행정시('제주시', '서귀포시')가 '소재재도로명주소' Column(열) data의 두번째 단어에 위치합니다. 행정시를 '기초' Column(열)에 입력하세요.
      • '세종특별자치시'의 경우 기초자치단체가 없습니다. '세종특별자치시'의 경우 '기초' Column(열)에는 Null값(None)을 입력해주세요.
    • 조건3: '소재재도로명주소' Column(열) data에서 광역/기초자치단체(행정시포함)에 포함되지 않은 데이터는 '상세' Column(열)을 만들어 입력하세요.
    • 조건4: '소재지도로명주소', '광역', '기초', '상세 Column(행)의 data는 해당 data의 앞-뒤로 띄어쓰기 등 공백이 없어야 합니다.
    • 조건5: Index 또는 순서(order)는 변경하지 마세요.
    • 조건6: 'df_target' 변수에 결과 DataFrame을 할당하세요.
df_target['소재지도로명주소'].unique()[0].split()
df_target['광역'] = None
df_target['기초'] = None
df_target['상세'] = None

# 이용 모양 (https://blog.naver.com/hsy20130/222805329339)
# def add(a,b):
#    return a + b


def add(address, newList):
    addContents = address.split()

    if newList == '광역':
        add = addContents[0]
        if add in ['세종특별시', '세종특별자치시']:
            add = '세종특별자치시'
    
    elif newList == '기초':
        add = addContents[1]

        if addContents[0] in ['세종특별시', '세종특별자치시']:
            add = None
        
    elif newList == '상세':
        add = ' '.join(addContents[2:])

        if addContents[0] in ['세종특별시', '세종특별자치시']:
            add = ' '.join(addContents[1:])

    elif newList == '소재지':
        add = address.replace('세종특별시', '세종특별자치시').strip()

    return add
    
for idx, row in df_target.iterrows():
    df_target.at[idx, '소재지도로명주소'] = add(row['소재지도로명주소'], '소재지')
    df_target.at[idx, '광역'] = add(row['소재지도로명주소'], '광역')
    df_target.at[idx, '기초'] = add(row['소재지도로명주소'], '기초')
    df_target.at[idx, '상세'] = add(row['소재지도로명주소'], '상세')

df_target.head(2)

문제 4-1) 원하는 정보 얻기 01 (10점)

  • 3단계의 DataFrame(df_target)을 이용하여 아래의 조건에 맞는 정보를 구하세요.
    • 광역자치단체별 박물관/미술관의 총 수를 확인하고자 합니다.
    • 조건1: df_target의 '광역' Column(열)에 있는 광역자치단체 data를 이용하여 광역자치단체별 박물관/미술관의 총 수를 나타내주세요.
    • 조건2: 결과 DataFrame의 Index는 광역자치단체입니다. 광역자치단체의 우선순위는 아래 province_dict의 value(값)으로 제공합니다. Index의 순서를 광역자치단체의 우선순위에 따라 나열해주세요.
    • 조건3: 결과 DataFrame의 박물관/미술관의 총 수를 나타내는 Column(열)의 이름은 '박물관미술관수' 입니다.
    • 조건4: 'df_result' 변수에 결과 DataFrame을 할당하세요.
province_dict = {
    '서울특별시': 0,
    '부산광역시': 1,
    '대구광역시': 2,
    '인천광역시': 3,
    '광주광역시': 4,
    '대전광역시': 5,
    '울산광역시': 6,
    '세종특별자치시': 7,
    '경기도': 8,
    '강원도': 9,
    '충청북도': 10,
    '충청남도': 11,
    '전라북도': 12,
    '전라남도': 13,
    '경상북도': 14,
    '경상남도': 15,
    '제주특별자치도': 16
}
# 데이터 프레임 만들기
# (https://bohemihan.tistory.com/entry/Pandas-Groupby-%ED%95%A8%EC%88%98-%EA%BC%AD-%EC%95%8C%EC%95%84%EC%95%BC%ED%95%A0-%EA%B8%B0%EB%B3%B8-%EC%82%AC%EC%9A%A9%EB%B2%95)

# size 함수로 시리즈(1차형태)반환, to_frame으로 dataframe(2차형태) 반환
df_result = df_target.groupby('광역').size().to_frame(name='박물관미술관수')
df_result = df_result.sort_index(key=lambda x: x.map(province_dict))

df_result

문제 4-2) 원하는 정보 얻기 02 (10점)

  • 3단계의 DataFrame(df_target)을 이용하여 아래의 조건에 맞는 정보를 구하세요.
    • 광역자치단체-기초자치단체(행정시)의 박물관/미술관의 총 수가 8개인 광역-기초자치단체(행정시)를 확인하고자 합니다.
    • 조건1: df_target의 '광역'과 '기초' Column(열)에 있는 광역자치단체/기초자치단체(행정시) data를 이용하여 광역자치단체-기초자치단체(행정시)별 박물관/미술관의 총 수가 8개인 곳을 찾아주세요.
    • 조건2: 결과 DataFrame의 '광역' Column(열)에 광역자치단체를, '기초' Column(열)에 기초자치단체(행정시)를 입력해주세요.
    • 조건3: '광역' Column(열)은 4-1문제와 같이 광역자치단체의 우선순위에 따라 나열해주세요.
      • 4-1의 province_dict 참고
    • 조건4: 같은 광역자치단체가 있다면, '기초' Column(열)의 data는 가나다 순의 역순으로 나열해주세요.
    • 조건5: 결과 DataFrame의 박물관/미술관의 총 수를 나타내는 Column(열)의 이름은 '박물관미술관수' 입니다.
    • 조건6: Index는 숫자(정수) 오름차순으로 설정해주세요.
    • 조건7: 'df_result' 변수에 결과 DataFrame을 할당하세요.
# size 함수로 시리즈(1차형태)반환, to_frame으로 dataframe(2차형태) 반환
df_result = df_target.groupby(['광역', '기초'], dropna=False).size().to_frame(name='박물관미술관수')
# 광역자치단체-기초자치단체(행정시)별 박물관/미술관의 총 수가 8개인 곳
# country가 한국일 때를 선택하고 싶다면 : df[df['country'] == '한국'] (https://computer-science-student.tistory.com/375)
df_result = df_result[df_result['박물관미술관수'] == 8]
# ort_remaining : multi index의 경우 다른 레벨에 대해서도 정렬을할지 여부, True로 할 경우한 레벨에 대한 정렬이 완료되면, 다른 레벨도 정렬(https://wikidocs.net/153330)
df_result = df_result.sort_index(level=1, ascending=False).sort_index(level=0, key=lambda x: x.map(province_dict), sort_remaining=False)

df_result = df_result.reset_index()

문제 4-3) 원하는 정보 얻기 03 (10점)

  • 3단계의 DataFrame(df_target)을 이용하여 아래의 조건에 맞는 정보를 구하세요.
    • 광역자치단체-박물관미술관구분(사립, 국립, 공립, 대학)의 평균 관람료 차이를 알아보고자 합니다.
    • 조건1: df_target의 '광역'과 '박물관미술관구분' Column(열)에 있는 광역자치단체/박물관미술관구분 data를 이용하여 광역자치단체-박물관미술관구분별 평균 어른관람료-평균 어린이관람료 간 차이가 가장 크고 작은 곳을 찾아주세요.
      • 단, 어른관람료 또는 어린이관람료가 둘 중 하나라도 0원(무료)인 박물관/미술관의 경우 평균 계산에서 제외해주세요.
    • 조건3: 결과 DataFrame의 '광역' Index에 광역자치단체를, '박물관미술관구분' Index에 박물관미술관구분를 입력해주세요.
    • 조건4: '광역' Index은 4-1문제와 같이 광역자치단체의 우선순위에 따라 나열해주세요.
      • 4-1의 province_dict 참고
    • 조건5: 결과 DataFrame의 '어른관람료' Column(열)은 광역자치단체-박물관미술관구분별 평균 어른 관람료를, '어린이관람료' Column(열)은 광역자치단체-박물관미술관구분별 평균 어린이 관람료를, '관람료차이' Column(열)은 광역자치단체-박물관미술관구분별 평균 어른 관람료 - 평균 어린이 관람료(차액)을 입력해주세요.
      • 어른/어린이 관람료 및 관람료차이는 평균값에서 소숫점 첫째 자리에서 반올림한 정수 값을 입력해주세요.
    • 조건6: 'df_result' 변수에 결과 DataFrame을 할당하세요.
for idx, row in df_target.iterrows():
    if row['어린이관람료'] == 0 or row['어른관람료'] == 0:
        df_target = df_target.drop(idx, axis=0)

df_result = df_target.pivot_table(index=['광역', '박물관미술관구분'], values=['어른관람료', '어린이관람료'], aggfunc='mean')
df_result['관람료차이'] = df_result['어른관람료'] - df_result['어린이관람료']

df_result = df_result[(df_result['관람료차이'] == df_result['관람료차이'].min()) | (df_result['관람료차이'] == df_result['관람료차이'].max())]
df_result = df_result.round(-1).astype(int)
df_result = df_result[['어른관람료', '어린이관람료', '관람료차이']]
df_result = df_result.sort_index()

문제 4-4) 원하는 정보 얻기 04 (10점)

  • 3단계의 DataFrame(df_target)을 이용하여 아래의 조건에 맞는 정보를 구하세요.
    • 가족(어른2, 청소년1, 어린이1)이 공휴일에 제주특별자치도 제주시에 있는 미술관을 관람하려 합니다. 총 관람료가 2만원 이하, 공휴일 4시간 이상 관람 가능한 미술관 list를 보여주세요.
    • 조건1: 가족(어른 2명, 청소년 1명, 어린이 1명)의 총 관람료가 2만원 이하여야 합니다.
    • 조건2: 제주특별자치도의 제주시에 있는 미술관을 가려고 합니다.
      • 미술관: 이 Test에서는 df_target의 시설명 Column(열)에 있는 data 중 <'미술관' 또는 '갤러리' 또는 '아트'> 라는 글자들이 포함되어 있는 곳을 '미술관'이라고 정의합니다.
    • 조건3: 공휴일에 가고자 합니다. 공휴일에 4시간 이상 관람 가능한 미술관이어야 합니다.
    • 조건4: 미술관 List의 Frame은 df_target과 동일합니다.
    • 조건5: 'df_result' 변수에 결과 DataFrame을 할당하세요.
budget = 20000

a = (df_target['어른관람료'] * 2 + df_target['청소년관람료'] + df_target['어린이관람료']) <= budget
b = df_target['기초'] == '제주시'
c = df_target['광역']=='제주특별자치도'
d = df_target['시설명'].str.contains('미술관|갤러리|아트')
e = df_target['공휴일관람가능시간'] >= 4

df_result = df_target[a&b&c&d&e]
df_result

오늘의 시험은 70 점으로 마무리...
어디가 왜 틀렸는지 다음주 해설강의를 통해 오답 정리를 해볼 예정이다...😁

profile
비전공자의 데이터 공부법

0개의 댓글