[사전학습] 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.0 | A |
1 | 김연아 | 수학 | 1.0 | A |
2 | 홍길동 | 컴퓨터 | 3.5 | A |
3 | 장범준 | 철학 | 2.7 | A |
4 | 강감찬 | 경영학 | 4.0 | A |
1
2
3
4
# 성적에 따라 등급 부여
grade = np.array(['B', 'D', 'B', 'C', 'A'])
df['등급'] = grade
display(df)
이름 | 학과 | 성적 | 등급 | |
---|---|---|---|---|
0 | 아이유 | 국문학 | 3.0 | B |
1 | 김연아 | 수학 | 1.0 | D |
2 | 홍길동 | 컴퓨터 | 3.5 | B |
3 | 장범준 | 철학 | 2.7 | C |
4 | 강감찬 | 경영학 | 4.0 | A |
1
2
3
4
5
6
# 나이를 의미하는 age라는 시리즈 생성
age = pd.Series([21, 20, 24, 23, 28])
# 데이터프레임내 나이 컬럼을 만들고 시리즈를 값으로 할당
df['나이'] = age
display(df)
이름 | 학과 | 성적 | 등급 | 나이 | |
---|---|---|---|---|---|
0 | 아이유 | 국문학 | 3.0 | B | 21 |
1 | 김연아 | 수학 | 1.0 | D | 20 |
2 | 홍길동 | 컴퓨터 | 3.5 | B | 24 |
3 | 장범준 | 철학 | 2.7 | C | 23 |
4 | 강감찬 | 경영학 | 4.0 | A | 28 |
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.0 | B | 21 |
1 | 김연아 | 수학 | 1.0 | D | 20 |
2 | 홍길동 | 컴퓨터 | 3.5 | B | 24 |
3 | 장범준 | 철학 | 2.7 | C | 23 |
4 | 강감찬 | 경영학 | 4.0 | a | 28 |
인덱스 설정 및 리셋
1
df.index
1
RangeIndex(start=0, stop=5, step=1)
1
2
df.index = ['one', 'two', 'three', 'four', 'five']
df
이름 | 학과 | 성적 | 등급 | 나이 | |
---|---|---|---|---|---|
one | 아이유 | 국문학 | 3.0 | B | 21 |
two | 김연아 | 수학 | 1.0 | D | 20 |
three | 홍길동 | 컴퓨터 | 3.5 | B | 24 |
four | 장범준 | 철학 | 2.7 | C | 23 |
five | 강감찬 | 경영학 | 4.0 | a | 28 |
1
2
3
sex = pd.Series(['여자', '여자', '남자', '남자', '남자'])
df['성별'] = sex
df
이름 | 학과 | 성적 | 등급 | 나이 | 성별 | |
---|---|---|---|---|---|---|
one | 아이유 | 국문학 | 3.0 | B | 21 | NaN |
two | 김연아 | 수학 | 1.0 | D | 20 | NaN |
three | 홍길동 | 컴퓨터 | 3.5 | B | 24 | NaN |
four | 장범준 | 철학 | 2.7 | C | 23 | NaN |
five | 강감찬 | 경영학 | 4.0 | a | 28 | NaN |
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.0 | B | 21 | 여자 |
two | 김연아 | 수학 | 1.0 | D | 20 | 여자 |
three | 홍길동 | 컴퓨터 | 3.5 | B | 24 | 남자 |
four | 장범준 | 철학 | 2.7 | C | 23 | 남자 |
five | 강감찬 | 경영학 | 4.0 | a | 28 | 남자 |
1
2
3
# 현재 설정되어 있는 인덱스 리셋
#df.reset_index(inplace=True) # inplace=True라는 인수값을 주면 데이터프레임 원본에 바로 적용 됨
df.reset_index()
index | 이름 | 학과 | 성적 | 등급 | 나이 | 성별 | |
---|---|---|---|---|---|---|---|
0 | one | 아이유 | 국문학 | 3.0 | B | 21 | 여자 |
1 | two | 김연아 | 수학 | 1.0 | D | 20 | 여자 |
2 | three | 홍길동 | 컴퓨터 | 3.5 | B | 24 | 남자 |
3 | four | 장범준 | 철학 | 2.7 | C | 23 | 남자 |
4 | five | 강감찬 | 경영학 | 4.0 | a | 28 | 남자 |
1
df
이름 | 학과 | 성적 | 등급 | 나이 | 성별 | |
---|---|---|---|---|---|---|
one | 아이유 | 국문학 | 3.0 | B | 21 | 여자 |
two | 김연아 | 수학 | 1.0 | D | 20 | 여자 |
three | 홍길동 | 컴퓨터 | 3.5 | B | 24 | 남자 |
four | 장범준 | 철학 | 2.7 | C | 23 | 남자 |
five | 강감찬 | 경영학 | 4.0 | a | 28 | 남자 |
1
2
df.reset_index(inplace=True)
df
index | 이름 | 학과 | 성적 | 등급 | 나이 | 성별 | |
---|---|---|---|---|---|---|---|
0 | one | 아이유 | 국문학 | 3.0 | B | 21 | 여자 |
1 | two | 김연아 | 수학 | 1.0 | D | 20 | 여자 |
2 | three | 홍길동 | 컴퓨터 | 3.5 | B | 24 | 남자 |
3 | four | 장범준 | 철학 | 2.7 | C | 23 | 남자 |
4 | five | 강감찬 | 경영학 | 4.0 | a | 28 | 남자 |
1
df.set_index('이름')
index | 학과 | 성적 | 등급 | 나이 | 성별 | |
---|---|---|---|---|---|---|
이름 | ||||||
아이유 | one | 국문학 | 3.0 | B | 21 | 여자 |
김연아 | two | 수학 | 1.0 | D | 20 | 여자 |
홍길동 | three | 컴퓨터 | 3.5 | B | 24 | 남자 |
장범준 | four | 철학 | 2.7 | C | 23 | 남자 |
강감찬 | five | 경영학 | 4.0 | a | 28 | 남자 |
1
df.set_index('이름', inplace=True)
1
df
index | 학과 | 성적 | 등급 | 나이 | 성별 | |
---|---|---|---|---|---|---|
이름 | ||||||
아이유 | one | 국문학 | 3.0 | B | 21 | 여자 |
김연아 | two | 수학 | 1.0 | D | 20 | 여자 |
홍길동 | three | 컴퓨터 | 3.5 | B | 24 | 남자 |
장범준 | four | 철학 | 2.7 | C | 23 | 남자 |
강감찬 | five | 경영학 | 4.0 | a | 28 | 남자 |
컬럼 삭제
1
2
# 성별 컬럼 삭제 (dataframe의 drop 메서드 이용)
df.drop('성별', axis=1) # drop에서 axis=1의 값을 주면 컬럼을 삭제하겠다는 의미
index | 학과 | 성적 | 등급 | 나이 | |
---|---|---|---|---|---|
이름 | |||||
아이유 | one | 국문학 | 3.0 | B | 21 |
김연아 | two | 수학 | 1.0 | D | 20 |
홍길동 | three | 컴퓨터 | 3.5 | B | 24 |
장범준 | four | 철학 | 2.7 | C | 23 |
강감찬 | five | 경영학 | 4.0 | a | 28 |
1
df
index | 학과 | 성적 | 등급 | 나이 | 성별 | |
---|---|---|---|---|---|---|
이름 | ||||||
아이유 | one | 국문학 | 3.0 | B | 21 | 여자 |
김연아 | two | 수학 | 1.0 | D | 20 | 여자 |
홍길동 | three | 컴퓨터 | 3.5 | B | 24 | 남자 |
장범준 | four | 철학 | 2.7 | C | 23 | 남자 |
강감찬 | five | 경영학 | 4.0 | a | 28 | 남자 |
1
df.drop('성별', axis='columns')
index | 학과 | 성적 | 등급 | 나이 | |
---|---|---|---|---|---|
이름 | |||||
아이유 | one | 국문학 | 3.0 | B | 21 |
김연아 | two | 수학 | 1.0 | D | 20 |
홍길동 | three | 컴퓨터 | 3.5 | B | 24 |
장범준 | four | 철학 | 2.7 | C | 23 |
강감찬 | five | 경영학 | 4.0 | a | 28 |
1
df
index | 학과 | 성적 | 등급 | 나이 | 성별 | |
---|---|---|---|---|---|---|
이름 | ||||||
아이유 | one | 국문학 | 3.0 | B | 21 | 여자 |
김연아 | two | 수학 | 1.0 | D | 20 | 여자 |
홍길동 | three | 컴퓨터 | 3.5 | B | 24 | 남자 |
장범준 | four | 철학 | 2.7 | C | 23 | 남자 |
강감찬 | five | 경영학 | 4.0 | a | 28 | 남자 |
1
2
df2 = df.drop('성별', axis=1)
df2
index | 학과 | 성적 | 등급 | 나이 | |
---|---|---|---|---|---|
이름 | |||||
아이유 | one | 국문학 | 3.0 | B | 21 |
김연아 | two | 수학 | 1.0 | D | 20 |
홍길동 | three | 컴퓨터 | 3.5 | B | 24 |
장범준 | four | 철학 | 2.7 | C | 23 |
강감찬 | five | 경영학 | 4.0 | a | 28 |
1
2
df.set_index('index', inplace=True)
df
학과 | 성적 | 등급 | 나이 | 성별 | |
---|---|---|---|---|---|
index | |||||
one | 국문학 | 3.0 | B | 21 | 여자 |
two | 수학 | 1.0 | D | 20 | 여자 |
three | 컴퓨터 | 3.5 | B | 24 | 남자 |
four | 철학 | 2.7 | C | 23 | 남자 |
five | 경영학 | 4.0 | a | 28 | 남자 |
1
2
# 데이터프레임 행 삭제
df.drop('one', axis=0)
학과 | 성적 | 등급 | 나이 | 성별 | |
---|---|---|---|---|---|
index | |||||
two | 수학 | 1.0 | D | 20 | 여자 |
three | 컴퓨터 | 3.5 | B | 24 | 남자 |
four | 철학 | 2.7 | C | 23 | 남자 |
five | 경영학 | 4.0 | a | 28 | 남자 |
1
df
학과 | 성적 | 등급 | 나이 | 성별 | |
---|---|---|---|---|---|
index | |||||
one | 국문학 | 3.0 | B | 21 | 여자 |
two | 수학 | 1.0 | D | 20 | 여자 |
three | 컴퓨터 | 3.5 | B | 24 | 남자 |
four | 철학 | 2.7 | C | 23 | 남자 |
five | 경영학 | 4.0 | a | 28 | 남자 |
실습 : 전국 무인 교통 단속 카메라 표준 데이터 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.