edwith_python_(4)데이터 색인하기

Updated:

edwith 부스트코스 파이썬으로 시작하는 데이터 사이언스 를 공부하는 과정입니다.

지난 포스트 :point_right: edwith_python_(3)기초 통계값 확인하기


1.12 데이터 색인하기

  • 특정 데이터만 모아서 따로 보기
“상권업종중분류명”이 “약국/한약방”인 데이터만 가져와서 df_medical 변수에 담기
df_medical = df[df["상권업종중분류명"] == "약국/한약방"].copy()

데이터 분석 과정에서 수정하는 값이 원본에 영향을 주지 않도록 하기 위해서 .copy()를 사용

“상권업종대분류명”이 “의료”인 데이터만 가져오고, “상권업종중분류명” 값 별로 개수 정보 불러오기
df.loc[df["상권업종대분류명"] == "의료", "상권업종중분류명"].value_counts()

*결과*

병원          60774
약국/한약방      20923
수의업          5323
유사의료업        3774
의료관련서비스업      541
Name: 상권업종중분류명, dtype: int64

df.loc를 사용하면 행,열을 함께 가져올 수 있음

“유사의료업”만 따로 모아보기
df_medi = df[df["상권업종중분류명"]  == "유사의료업"] 
“상호명”을 기준으로 그룹화하여 개수 카운팅
df["상호명"].value_counts()

*결과*

리원           152
온누리약국        149
경희한의원        141
우리약국         119
중앙약국         111
            ... 
우리연세내과         1
광명약방           1
마디필정형외과의원      1
사랑해차의원         1
닥터이치과          1
Name: 상호명, Length: 56910, dtype: int64

1.12.1 여러 조건으로 색인하기

“상권업종소분류명”이 “약국”이고, “시도명”이 “서울특별시”인 데이터만 가져오기
df_seoul_drug = df[(df["상권업종소분류명"] == "약국") & (df["시도명"] == "서울특별시")]

1.12.2 ‘구’별로 보기

‘구’별로 약국이 몇 개 있는 지 확인하고 c 라는 변수에 담기
c = df_seoul_drug["시군구명"].value_counts()
c.head()

*결과*

강남구     374
동대문구    261
광진구     212
서초구     191
송파구     188
Name: 시군구명, dtype: int64
위 내용을 normalize=True 옵션을 통해 ‘구’별로 비율을 구하고, n 이라는 변수에 담기
n = df_seoul_drug["시군구명"].value_counts(normalize=True)
n.head()

*결과*

강남구     0.104498
동대문구    0.072925
광진구     0.059234
서초구     0.053367
송파구     0.052529
Name: 시군구명, dtype: float64
위 내용을 막대그래프로 나타내기
c.plot.barh(figsize=(6,7))

*결과*

“시군구명”을 기준으로 그룹화 하여 ‘구’별로 종합병원의 수 카운팅
df_seoul_hospital["시군구명"].value_counts()

*결과*

강남구     15
영등포구     8
광진구      6
서초구      6
강동구      5
송파구      5
중구       5
양천구      4
강북구      4
도봉구      4
서대문구     4
성북구      3
동대문구     2
구로구      2
중랑구      2
관악구      2
성동구      2
종로구      2
노원구      2
강서구      2
금천구      2
은평구      1
마포구      1
동작구      1
용산구      1
Name: 시군구명, dtype: int64

1.12.3 텍스트 데이터 색인하기

  • ‘종합병원’에 해당하는 데이터만 필요하다는 가정 하에, 부적절한 데이터를 색인하여 제거해보자.
상호명에 “종합병원”이라는 단어가 포함되지 ‘않는’ 상호명 데이터만 불러오기
df_seoul_hospital.loc[~df_seoul_hospital["상호명"].str.contains("종합병원"), "상호명"].unique()

*결과*

array(['대진의료재단', '홍익병원별관', 'SNUH', '평화드림여의도성모병원의료기매장', '한양', '백산의료재단친구병원',
       '서울보훈병원', '서울성모병원장례식장꽃배달', '서울대학교병원', '알콜중독및정신질환상담소',
       '강남성모병원장례식장꽃배달', '제일병원', '이랜드클리닉', '사랑나눔의료재단', '우울증센터', '성심의료재단',
       '다나의료재단', '서울아산병원신관', '원자력병원장례식장', '국민의원', '고려대학교구로병원', '학교법인일송학원',
       '삼성의료원장례식장', '희명스포츠의학센터인공신장실', '연세대학교의과대학강남세브란스', '국립정신병원',
       '코아클리닉', '수서제일의원', '사랑의의원', '한국전력공사부속한일병원', '신촌연세병원', '창동제일의원',
       '영동세브란스병원', '제일성심의원', '삼성의료재단강북삼성태', '서울시립보라매병원', '서울이의원',
       '서울대학교병원비상계획외래', '평화드림서울성모병원의료', '홍익병원', '사랑나눔의료재단서', '독일의원',
       '서울연합의원', '우신향병원', '동부제일병원', '아산재단금강병원', '명곡안연구소', '아산재단서울중앙병원',
       '메디힐특수여객', '삼성생명공익재단삼성서', '성광의료재단차병원', '한국건강관리협회서울특',
       '정해복지부설한신메디피아', '성베드로병원', '성애의료재단', '실로암의원', 'Y&T성모마취과', '광진성모의원',
       '서울현대의원', '이노신경과의원', '송정훼밀리의원', '서울중앙의원', '영남의료재단', '인제대학교서울백병원',
       '한국필의료재단', '세브란스의원', '가톨릭대학교성바오로병원장례식장', '서울연세의원', '사랑의병원',
       '성삼의료재단미즈메디병원', '씨엠충무병원', '성신의원', '원진재단부설녹색병원', '송파제일의원',
       '카톨릭성모의원', '한양성심의원', '관악성모의원', '강남센트럴병원', '우이한솔의원', '우리들병원',
       '서울성모병원어린이집', '건국대학교병원', '서울적십자병원', '북부성모의원', '한림대학교부속한강성심병원장례식장',
       '서울성모병원응급의료센터', '라마르의원', '가톨릭대학교여의도성모병원', '씨엠병원'], dtype=object)

’~’ 표시는 해당하지 ‘않는’ 데이터를 가져옴…(?)

“상호명”에 특정 단어가 들어가는 데이터만 가져오기 - 꽃배달
df_seoul_hospital[df_seoul_hospital["상호명"].str.contains("꽃배달")]

*결과*

  상가업소번호 상호명 상권업종대분류코드 상권업종대분류명 상권업종중분류코드 상권업종중분류명 상권업종소분류코드 상권업종소분류명 시도명 시군구코드 시군구명 행정동코드 행정동명 법정동코드 법정동명 지번코드 대지구분코드 대지구분명 지번본번지 지번주소 도로명코드 도로명 건물본번지 건물관리번호 도로명주소 구우편번호 신우편번호 경도 위도  
2803 20895655 서울성모병원장례식장꽃배달 S 의료 S01 병원 S01B01 종합병원 서울특별시 11650.0 서초구 1165058100 반포4동 1.165011e+09 반포동 1165010700205510000 1 대지 551 서울특별시 서초구 반포동 551 116504163330 서울특별시 서초구 사평대로28길 55 1165010700105510000017194 서울특별시 서초구 사평대로28길 55 137040.0 6578.0 127.000682 37.498257  
4644 22020310 강남성모병원장례식장꽃배달 S 의료 S01 병원 S01B01 종합병원 서울특별시 11650.0 서초구 1165058100 반포4동 1.165011e+09 반포동 1165010700205470006 1 대지 547 서울특별시 서초구 반포동 547-6 116504163242 서울특별시 서초구 반포대로39길 56 1165010700105470006016762 서울특별시 서초구 반포대로39길 56-24 137040.0 6578.0 127.001756 37.499095  
“상호명”에 특정 단어가 들어가는 데이터만 가져오기 - 의료기
df_seoul_hospital[df_seoul_hospital["상호명"].str.contains("의료기")]

*결과*

  상가업소번호 상호명 상권업종대분류코드 상권업종대분류명 상권업종중분류코드 상권업종중분류명 상권업종소분류코드 상권업종소분류명 시도명 시군구코드 시군구명 행정동코드 행정동명 법정동코드 법정동명 지번코드 대지구분코드 대지구분명 지번본번지 지번주소 도로명코드 도로명 건물본번지 건물관리번호 도로명주소 구우편번호 신우편번호 경도 위도  
1917 23210677 평화드림여의도성모병원의료기매장 S 의료 S01 병원 S01B01 종합병원 서울특별시 11560.0 영등포구 1156054000 여의동 1.156011e+09 여의도동 1156011000200620000 1 대지 62 서울특별시 영등포구 여의도동 62 115603118001 서울특별시 영등포구 63로 10 1156011000100620000031477 서울특별시 영등포구 63로 10 150713.0 7345.0 126.936693 37.51829  
                                                             
꽃배달, 의료기, 장례식장, 상담소, 어린이집 등은 종합병원과 무관하므로 “상호명”에 이 단어들이 포함된 데이터를 색인하여, 제거할 데이터의 인덱스만 drop_row에 담아주고 list 형태로 변환
drop_row = df_seoul_hospital[df_seoul_hospital["상호명"].str.contains("꽃배달|의료기|장례식장|상담소|어린이집")].index
drop_row = drop_row.tolist()
drop_row

*결과*

[1917, 2803, 4431, 4644, 7938, 10283, 47008, 60645, 70177]

.index: 해당하는 인덱스 번호를 출력

“의원”으로 끝나는 데이터도 종합병원으로 판단하기 어려우므로, drop_row2에 담아 list 형태로 전환
drop_row2 = df_seoul_hospital[df_seoul_hospital["상호명"].str.endswith("의원")].index
drop_row2 = drop_row2.tolist()
drop_row2

*결과*

[8479,
 12854,
 13715,
 14966,
 16091,
 18047,
 20200,
 20415,
 30706,
 32889,
 34459,
 34720,
 35696,
 37251,
 45120,
 49626,
 51575,
 55133,
 56320,
 56404,
 56688,
 57551,
 62113,
 76508]
삭제할 행을 drop_row_total에 합쳐주기
drop_row_total = drop_row + drop_row2
len(drop_row_total)

*결과*

33
해당 셀을 삭제하고 삭제 전과 후의 행의 개수를 비교
print(df_seoul_hospital.shape)
df_seoul_hospital = df_seoul_hospital.drop(drop_row_total, axis = 0)
print(df_seoul_hospital.shape)

*결과*

(91, 29)
(58, 29)

행 기준이므로 axis = 0 막간 꿀팁:bulb:
출력 결과는 코드셀의 맨 마지막 줄에 작성한 내용만 출력되는데, 중간에 작성한 내용도 출력하고 싶으면, print()를 사용하면 됨

“시군구명”에 따라 종합병원 숫자를 seaborn의 countplot 으로 나타내고, “시군구명”을 기준으로 value_counts가 많은 순으로 그래프 나타내기
plt.figure(figsize=(15,4))
sns.countplot(data=df_seoul_hospital, x ="시군구명", 
              order=df_seoul_hospital["시군구명"].value_counts().index)

*결과*

seaborn의 그래프 사이즈는 그래프 그리는 함수 전에 plt.figure을 사용하여 지정할 수 있음

전처리가 잘 되었는 지 확인하기
df_seoul_hospital["상호명"].unique()

*결과*

array(['대진의료재단', '홍익병원별관', 'SNUH', '한양', '백산의료재단친구병원', '서울보훈병원',
       '서울대학교병원', '제일병원', '이랜드클리닉', '사랑나눔의료재단', '우울증센터', '성심의료재단',
       '다나의료재단', '서울아산병원신관', '고려대학교구로병원', '학교법인일송학원', '희명스포츠의학센터인공신장실',
       '연세대학교의과대학강남세브란스', '국립정신병원', '코아클리닉', '한국전력공사부속한일병원', '신촌연세병원',
       '영동세브란스병원', '삼성의료재단강북삼성태', '서울시립보라매병원', '서울대학교병원비상계획외래',
       '평화드림서울성모병원의료', '홍익병원', '사랑나눔의료재단서', '우신향병원', '동부제일병원', '아산재단금강병원',
       '명곡안연구소', '아산재단서울중앙병원', '메디힐특수여객', '삼성생명공익재단삼성서', '성광의료재단차병원',
       '한국건강관리협회서울특', '정해복지부설한신메디피아', '성베드로병원', '성애의료재단', 'Y&T성모마취과',
       '영남의료재단', '인제대학교서울백병원', '한국필의료재단', '사랑의병원', '성삼의료재단미즈메디병원',
       '씨엠충무병원', '원진재단부설녹색병원', '강남센트럴병원', '우리들병원', '건국대학교병원', '서울적십자병원',
       '서울성모병원응급의료센터', '가톨릭대학교여의도성모병원', '씨엠병원'], dtype=object)

우울증센터, 메디힐특수여객 등 전처리가 더 필요한 요소들이 보이므로, 위 내용 반복 필요!

다음 포스트 :point_right: edwith_python_(5)위도, 경도 데이터를 이용하여 지도에 나타내기

Categories:

Updated:

Leave a comment