Post

[사전학습] 2.2 데이터 변경

데이터 변경

1
2
import numpy as np
import pandas as pd
1
2
df = pd.read_csv('./data/student.csv')
display(df)
이름학과성적
0아이유국문학3.0
1김연아수학1.0
2홍길동컴퓨터3.5
3장범준철학2.7
4강감찬경영학4.0

컬럼 생성

1
2
3
# '등급' 컬럼 생성
df['등급'] = 'A'
display(df)
이름학과성적등급
0아이유국문학3.0A
1김연아수학1.0A
2홍길동컴퓨터3.5A
3장범준철학2.7A
4강감찬경영학4.0A
1
2
3
4
# 성적에 따라 등급 부여
grade = np.array(['B', 'D', 'B', 'C', 'A'])
df['등급'] = grade
display(df)
이름학과성적등급
0아이유국문학3.0B
1김연아수학1.0D
2홍길동컴퓨터3.5B
3장범준철학2.7C
4강감찬경영학4.0A
1
2
3
4
5
6
# 나이를 의미하는 age라는 시리즈 생성
age = pd.Series([21, 20, 24, 23, 28])

# 데이터프레임내 나이 컬럼을 만들고 시리즈를 값으로 할당
df['나이'] = age
display(df)
이름학과성적등급나이
0아이유국문학3.0B21
1김연아수학1.0D20
2홍길동컴퓨터3.5B24
3장범준철학2.7C23
4강감찬경영학4.0A28
1
2
3
# 혼자 해본 것
df['등급'][df['성적'] >= 4] = 'a'
display(df)
1
2
3
4
C:\Users\zxwlg\miniconda3\envs\dx_env\lib\site-packages\ipykernel_launcher.py:2: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
이름학과성적등급나이
0아이유국문학3.0B21
1김연아수학1.0D20
2홍길동컴퓨터3.5B24
3장범준철학2.7C23
4강감찬경영학4.0a28

인덱스 설정 및 리셋

1
df.index
1
RangeIndex(start=0, stop=5, step=1)
1
2
df.index = ['one', 'two', 'three', 'four', 'five']
df
이름학과성적등급나이
one아이유국문학3.0B21
two김연아수학1.0D20
three홍길동컴퓨터3.5B24
four장범준철학2.7C23
five강감찬경영학4.0a28
1
2
3
sex = pd.Series(['여자', '여자', '남자', '남자', '남자'])
df['성별'] = sex
df
이름학과성적등급나이성별
one아이유국문학3.0B21NaN
two김연아수학1.0D20NaN
three홍길동컴퓨터3.5B24NaN
four장범준철학2.7C23NaN
five강감찬경영학4.0a28NaN
1
2
3
# 둘의 index가 다르기 때문에 NaN값
print(f"시리즈 sex의 인덱스      --> {sex.index}")
print(f"데이터프레임 df의 인덱스 --> {df.index}")
1
2
시리즈 sex의 인덱스      --> RangeIndex(start=0, stop=5, step=1)
데이터프레임 df의 인덱스 --> Index(['one', 'two', 'three', 'four', 'five'], dtype='object')
1
2
3
4
# 인덱스 통일 후 다시 성별 컬럼에 값 부여
sex.index = df.index
df['성별'] = sex
df
이름학과성적등급나이성별
one아이유국문학3.0B21여자
two김연아수학1.0D20여자
three홍길동컴퓨터3.5B24남자
four장범준철학2.7C23남자
five강감찬경영학4.0a28남자
1
2
3
# 현재 설정되어 있는 인덱스 리셋
#df.reset_index(inplace=True) # inplace=True라는 인수값을 주면 데이터프레임 원본에 바로 적용 됨
df.reset_index()
index이름학과성적등급나이성별
0one아이유국문학3.0B21여자
1two김연아수학1.0D20여자
2three홍길동컴퓨터3.5B24남자
3four장범준철학2.7C23남자
4five강감찬경영학4.0a28남자
1
df
이름학과성적등급나이성별
one아이유국문학3.0B21여자
two김연아수학1.0D20여자
three홍길동컴퓨터3.5B24남자
four장범준철학2.7C23남자
five강감찬경영학4.0a28남자
1
2
df.reset_index(inplace=True)
df
index이름학과성적등급나이성별
0one아이유국문학3.0B21여자
1two김연아수학1.0D20여자
2three홍길동컴퓨터3.5B24남자
3four장범준철학2.7C23남자
4five강감찬경영학4.0a28남자
1
df.set_index('이름')
index학과성적등급나이성별
이름
아이유one국문학3.0B21여자
김연아two수학1.0D20여자
홍길동three컴퓨터3.5B24남자
장범준four철학2.7C23남자
강감찬five경영학4.0a28남자
1
df.set_index('이름', inplace=True)
1
df
index학과성적등급나이성별
이름
아이유one국문학3.0B21여자
김연아two수학1.0D20여자
홍길동three컴퓨터3.5B24남자
장범준four철학2.7C23남자
강감찬five경영학4.0a28남자

컬럼 삭제

1
2
# 성별 컬럼 삭제 (dataframe의 drop 메서드 이용)
df.drop('성별', axis=1) # drop에서 axis=1의 값을 주면 컬럼을 삭제하겠다는 의미
index학과성적등급나이
이름
아이유one국문학3.0B21
김연아two수학1.0D20
홍길동three컴퓨터3.5B24
장범준four철학2.7C23
강감찬five경영학4.0a28
1
df
index학과성적등급나이성별
이름
아이유one국문학3.0B21여자
김연아two수학1.0D20여자
홍길동three컴퓨터3.5B24남자
장범준four철학2.7C23남자
강감찬five경영학4.0a28남자
1
df.drop('성별', axis='columns')
index학과성적등급나이
이름
아이유one국문학3.0B21
김연아two수학1.0D20
홍길동three컴퓨터3.5B24
장범준four철학2.7C23
강감찬five경영학4.0a28
1
df
index학과성적등급나이성별
이름
아이유one국문학3.0B21여자
김연아two수학1.0D20여자
홍길동three컴퓨터3.5B24남자
장범준four철학2.7C23남자
강감찬five경영학4.0a28남자
1
2
df2 = df.drop('성별', axis=1)
df2
index학과성적등급나이
이름
아이유one국문학3.0B21
김연아two수학1.0D20
홍길동three컴퓨터3.5B24
장범준four철학2.7C23
강감찬five경영학4.0a28
1
2
df.set_index('index', inplace=True)
df
학과성적등급나이성별
index
one국문학3.0B21여자
two수학1.0D20여자
three컴퓨터3.5B24남자
four철학2.7C23남자
five경영학4.0a28남자
1
2
# 데이터프레임 행 삭제
df.drop('one', axis=0)
학과성적등급나이성별
index
two수학1.0D20여자
three컴퓨터3.5B24남자
four철학2.7C23남자
five경영학4.0a28남자
1
df
학과성적등급나이성별
index
one국문학3.0B21여자
two수학1.0D20여자
three컴퓨터3.5B24남자
four철학2.7C23남자
five경영학4.0a28남자

실습 : 전국 무인 교통 단속 카메라 표준 데이터 json 데이터 pandas로 호출하기

1
2
3
import pandas as pd
import json
import requests
1
2
3
4
5
6
7
8
9
10
11
12
# open API 호출시 필요한 정보 입력
key = "dmuCB2wfe1qfcAIz42ts%2Be%2Fy5OVJaYeIINrowE2jZX0%2BuegviFtNclH8saHau%2BqjCMwcdtxJgNKRqlVIpPNdgg%3D%3D" # 발급받은 Key
pageNo = 0 # 요청 변수 : 페이지 번호 입력
row = 100 # 요청 변수 : 한 페이지 결과 수 입력

url = f'http://api.data.go.kr/openapi/tn_pubr_public_unmanned_traffic_camera_api?serviceKey={key}&pageNo={pageNo}&numOfRows={row}&type=json'

response = requests.get(url)

response.encoding = 'utf-8'

print(response.text[0:400])
1
{"response":{"header":{"resultCode": "30","resultMsg":"SERVICE KEY IS NOT REGISTERED ERROR."}}}
1
2
3
4
# 결과 객체에 있는 데이터(json) 조회
resulting_dict = json.loads(response.text) # json을 dict 타입으로 바꾸는 함수
# print(resulting_dict['header'])
resulting_dict.keys() # dictionary 키 확인 --> 중첩 딕셔너리임
1
dict_keys(['response'])
1
2
# 중첩 딕셔너리의 키 확인
resulting_dict['response'].keys()
1
dict_keys(['header'])
1
resulting_dict['response']['body'].keys()
1
2
3
4
5
6
7
8
9
---------------------------------------------------------------------------

KeyError                                  Traceback (most recent call last)

~\AppData\Local\Temp\ipykernel_11524\3251058356.py in <module>
----> 1 resulting_dict['response']['body'].keys()


KeyError: 'body'
1
resulting_dict['response']['body']['items'][0]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 주소, 카메라 위치, 위도, 경도의 정보만 출력

address_list = []
location_list = []
latitude_list = []
longitude_list = []

# dictionary 속 데이터 정보 입력
for tmp in resulting_dict['response']['body']['items']:
    address_list.append(tmp['rdnmadr'])
    location_list.append(tmp['itlpc'])
    latitude_list.append(tmp['latitude'])
    longitude_list.append(tmp['longitude'])

print(address_list[:10])
print(location_list[:10])
print(latitude_list[:10])
print(longitude_list[:10])
1
2
3
4
5
6
7
8
9
# dataframe으로 변환
df = pd.DataFrame({
    'address' : address_list,
    'location' : location_list,
    'latitude' : latitude_list,
    'longitude' : longitude_list
})

df
This post is licensed under CC BY 4.0 by the author.

[사전학습] 2.1 데이터 선택

[사전학습] 2.3 데이터 합치기