edwith_python_(4)데이터 색인하기
Updated:
edwith 부스트코스 파이썬으로 시작하는 데이터 사이언스 를 공부하는 과정입니다.
지난 포스트 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 막간 꿀팁
출력 결과는 코드셀의 맨 마지막 줄에 작성한 내용만 출력되는데, 중간에 작성한 내용도 출력하고 싶으면, 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)
우울증센터, 메디힐특수여객 등 전처리가 더 필요한 요소들이 보이므로, 위 내용 반복 필요!
Leave a comment