zip
/딕셔너리 → 데이터프레임zip
객체 다루기zip()
은 반복자(iterator)를 하나로 묶어 하나의 새로운 반복자를 만들어 낸다. 파이썬2에서는 튜플 리스트가 반환되었지만, 파이썬3에서는 zip
객체 반복자를 반환시킨다.
# 파이썬 3 기준
list_a = [1, 2, 3, 4, 5]
list_b = ['a', 'b', 'c', 'd', 'e']
list_zip = zip(list_a, list_b)
list_zip
<zip object at 0x11d490e08>
zip
객체를 다시 풀려고 하면 zip()
내부에 *
을 zip
객체 앞에 붙어 문제를 해결한다.
(1, 2, 3, 4, 5) ('a', 'b', 'c', 'd', 'e')
zip
객체 생성영화제목은 문자열, 등장배우는 리스트, 국가별 매출은 딕셔너리로 모두 반복자(iterator) 자료형이다. 이를 zip()
함수를 사용해서 zip
객체를 만든다.
movie = "Avengers - Endgame"
characters = ['ironman', 'captain america', 'spinder man']
sales = {'Korea': 100, 'Japan': 200,'China': 50}
avengers = zip(movie, characters, sales)
print(avengers)
<zip object at 0x11d5e8088>
for
루프로 뽑아내기for
루프로 zip
객체를 뽑아내게 되면 서로 길이가 다른 경우 다음과 같이 내부원소가 추출되는 것이 확인된다.
('A', 'ironman', 'Korea')
('v', 'captain america', 'Japan')
('e', 'spinder man', 'China')
zip
객체는 expendable 속성을 갖고 있어 다시 zip
객체를 생성시켜 주어야 한다. 그리고 나서 list()
함수로 감싸게 되면 튜플 리스트가 생성된다.
[('A', 'ironman', 'Korea'), ('v', 'captain america', 'Japan'), ('e', 'spinder man', 'China')]
zip
객체 → 리스트 튜플zip
객체, 튜플 리스트를 zip(*sales)
와 같이 풀어낼 수 있다.
sales = [('Korea', 100), ('Japan', 200), ('China', 50)]
country, revenue = zip(*sales)
print(country, revenue)
('Korea', 'Japan', 'China') (100, 200, 50)
zip
객체 → 데이터프레임zip
객체를 데이터프레임으로 생성하는데 칼럼명과 함께 dict()
객체를 pd.DataFrame()
에 넣어 판다스 데이터프레임으로 변환한다. 데이터프레임은 각 칼럼의 길이가 동일해야 하니 이를 염두에 두고 리스트 객체를 데이터프레임으로 변환시킨다.
zip
객체 → 딕셔너리 객체 → 데이터프레임import pandas as pd
# 튜플 리스트
sales = [('Korea', 100), ('Japan', 200), ('China', 50)]
# zip 객체 생성
colnames = ['국가', '매출']
country, revenue = zip(*sales)
sales_zip = zip(colnames, [country, revenue])
# 데이터프레임 생성
df = pd.DataFrame(dict(sales_zip))
df
국가 매출
0 Korea 100
1 Japan 200
2 China 50
딕셔너리를 데이터프레임으로 변경시키는 방법은 몇가지가 있다. 가장 일반적인 형태를 아래와 같이 raw_data
딕셔너리로 구성되어 있는 경우 이를 pd.DataFrame()
메쏘드를 사용해서 데이터프레임으로 변경시킨다.
import pandas as pd
raw_data = {
'요일': ['월요일', '화요일', '수요일', '목요일', '금요일', '토요일', '일요일'],
'공휴일': [True, True, True, False, True, True, False],
'알바수입': [100000, 150000, 50000, 30000, 200000, 120000, 10000]
}
raw_df = pd.DataFrame(raw_data)
raw_df
요일 공휴일 알바수입
0 월요일 True 100000
1 화요일 True 150000
2 수요일 True 50000
3 목요일 False 30000
4 금요일 True 200000
5 토요일 True 120000
6 일요일 False 10000
Using Python Dictionary as a database 블로그에 나온 중첩된 형태의 딕셔너리를 다루기 위해서 우선 딕셔너리 계층구조를 이해한다. office
가 가장 최상이고 그 아래 medical
과 parking
이 위한다. 이중 datastore['office']['medical']
만 추려 데이터프레임으로 변환시킨다.
datastore = { "office": {
"medical": [
{ "room-number": 100,
"use": "reception",
"sq-ft": 50,
"price": 75
},
{ "room-number": 101,
"use": "waiting",
"sq-ft": 250,
"price": 75
},
{ "room-number": 102,
"use": "examination",
"sq-ft": 125,
"price": 150
},
{ "room-number": 103,
"use": "examination",
"sq-ft": 125,
"price": 150
},
{ "room-number": 104,
"use": "office",
"sq-ft": 150,
"price": 100
}
],
"parking": {
"location": "premium",
"style": "covered",
"price": 750
}
}
}
pd.DataFrame(datastore['office']['medical'])
price room-number sq-ft use
0 75 100 50 reception
1 75 101 250 waiting
2 150 102 125 examination
3 150 103 125 examination
4 100 104 150 office
JSON
vs 파이썬 2웹크롤링을 통해 데이터를 입수하거나 API를 통해 데이터를 얻게 되면 JSON 형태 데이터를 많이 다루게 된다. 이런 경우 JSON을 적절한 파이썬 자료형태로 변환시켜두는 것이 향후 데이터 분석과 활용에 큰 도움이 되는 경우가 많다. 크게 JSON 객체(object)는 파이썬 딕셔너리로 JSON 배열(array)늘 파이썬 리스트로 변환되는 것을 기억하는 것이 좋겠다.
JSON | Python |
---|---|
object | dict |
array | list |
string | str |
number(int) | int |
number(real) | float |
true | True |
false | False |
null | None |
JSON 배열 데이터를 파이썬으로 넘길 경우 json.load()
메쏘드를 사용해서 키값(key-value) 짝을 맞춰 저장할 수 있다.
import json
drink_array = '{"음료": ["스타벅스", "커피빈", "안티구와", "커피콩"]}'
drink_data = json.loads(drink_array)
print(f'자료형: {type(drink_data)}')
자료형: <class 'dict'>
음료: 스타벅스
음료: 커피빈
음료: 안티구와
음료: 커피콩
JSON 객체를 파이썬 딕셔너리로 변환시켜서 이를 for
루프를 사용해서 간략히 출력한다.
json_input = '{"persons": [{"name": "Brian", "city": "Seattle"}, {"name": "David", "city": "Amsterdam"} ] }'
person_dict = json.loads(json_input)
for item in person_dict['persons']:
print(item['name'])
Brian
David