파이톤을 이용한 데이터 분석 Chapter 6
62387 단어 파이톤-데이터 분석
1. 텍스트 형식 데이터의 읽기와 쓰기
가장 많은 함수 사용:readcsv: 파일, URL 또는 파일형 대상에서 구분된 데이터를 읽습니다. 기본 구분자는 쉼표readtable: 파일, URL 또는 파일형 대상에서 구분된 데이터를 읽습니다. 기본 구분자는 탭('\t')readexcel: Excel의 XLS 또는 XLSX 파일에서 테이블read 읽기html: HTML 파일에서 모든 테이블 데이터 읽기 readjson: JSON 문자열에서 데이터 읽기 readql: SQL 조회 결과(SQLAlchemy)를pandas의 DtatFrame로 읽기
! type pydata-book-2nd-edition\examples\ex1.csv # type
a,b,c,d,message
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo
df = pd.read_csv('pydata-book-2nd-edition\examples\ex1.csv')
df
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
pd.read_table("pydata-book-2nd-edition\examples\ex1.csv", sep=',') #
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
1.1 읽기 옵션
a. 일부 파일은 헤더 줄을 포함하지 않아서pandas의 기본 열 이름을 지정할 수도 있고 열 이름을 지정할 수도 있습니다
! type pydata-book-2nd-edition\examples\ex2.csv
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo
pd.read_csv('pydata-book-2nd-edition\examples\ex2.csv') #
1 2 3 4 hello
0 5 6 7 8 world
1 9 10 11 12 foo
pd.read_csv("pydata-book-2nd-edition\examples\ex2.csv", header=None) # pandas
0 1 2 3 4
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
pd.read_csv('pydata-book-2nd-edition\examples\ex2.csv', names=['a', 'b', 'c', 'd', 'message'])
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
pd.read_csv('pydata-book-2nd-edition\examples\ex2.csv', names=['a', 'b', 'c', 'd', 'message'],
index_col='message')
a b c d
message
hello 1 2 3 4
world 5 6 7 8
foo 9 10 11 12
b. 여러 열에서 계층형 색인을 만들 수 있습니다.
! type pydata-book-2nd-edition\examples\csv_mindex.csv
key1,key2,value1,value2
one,a,1,2
one,b,3,4
one,c,5,6
one,d,7,8
two,a,9,10
two,b,11,12
two,c,13,14
two,d,15,16
pd.read_csv('pydata-book-2nd-edition\examples\csv_mindex.csv', index_col=['key1', 'key2'])
value1 value2
key1 key2
one a 1 2
b 3 4
c 5 6
d 7 8
two a 9 10
b 11 12
c 13 14
d 15 16
c. 필드를 여러 개의 공백으로 나누면 구분자 매개 변수에 정규 표현식을 전달할 수 있습니다.
list(open('pydata-book-2nd-edition\examples\ex3.txt'))
[' A B C
',
'aaa -0.264438 -1.026059 -0.619500
',
'bbb 0.927272 0.302904 -0.032399
',
'ccc -0.264273 -0.386314 -0.217601
',
'ddd -0.871858 -0.348382 1.100491
']
pd.read_table('pydata-book-2nd-edition\examples\ex3.txt', sep='\s+')
A B C # ,read_table
aaa -0.264438 -1.026059 -0.619500
bbb 0.927272 0.302904 -0.032399
ccc -0.264273 -0.386314 -0.217601
ddd -0.871858 -0.348382 1.100491
d. 매개 변수를 이용하여 이상이 발생한 파일 형식을 처리하는 데 도움을 줍니다. 보통: path/sep/헤더/indexcol/names/skiprows/na_values
! type pydata-book-2nd-edition\examples\ex4.csv
# hey!
a,b,c,d,message
# just wanted to make things more difficult for you
# who reads CSV files with computers, anyway?
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo
pd.read_csv('pydata-book-2nd-edition\examples\ex4.csv', skiprows=[0, 2, 3]) # skiprow
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
na_values 옵션은 목록이나 문자열을 가져와서 부족한 값을 처리할 수 있습니다.NA로 대체할 값 서열을 지정합니다
pd.read_csv('pydata-book-2nd-edition\examples\ex5.csv')
something a b c d message
0 one 1 2 3.0 4 NaN
1 two 5 6 NaN 8 world
2 three 9 10 11.0 12 foo
sentinels = {
'message': ['foo', 'NA'], 'something': ['two']}
pd.read_csv('pydata-book-2nd-edition\examples\ex5.csv', na_values=sentinels)
something a b c d message
0 one 1 2 3.0 4 NaN
1 NaN 5 6 NaN 8 world
2 three 9 10 11.0 12 NaN
1.2 블록 파일 읽기
대형 파일을 처리하거나 정확한 매개 변수 집합을 찾아서 큰 파일을 정확하게 처리할 때 파일의 작은 부분을 읽거나 작은 블록으로 파일을 옮겨다닐 수 있습니다.a. nrows는 줄의 일부만 읽습니다(전체 파일은 읽지 않음).
pd.options.display.max_rows = 10 # pandas
pd.read_csv('pydata-book-2nd-edition\examples\ex6.csv')
one two three four key
0 0.467976 -0.038649 -0.295344 -1.824726 L
1 -0.358893 1.404453 0.704965 -0.200638 B
2 -0.501840 0.659254 -0.421691 -0.057688 G
3 0.204886 1.074134 1.388361 -0.982404 R
4 0.354628 -0.133116 0.283763 -0.837063 Q
... ... ... ... ... ...
9995 2.311896 -0.417070 -1.409599 -0.515821 L
9996 -0.479893 -0.650419 0.745152 -0.646038 E
9997 0.523331 0.787112 0.486066 1.093156 K
9998 -0.362559 0.598894 -1.843201 0.887292 G
9999 -0.096376 -1.012999 -0.657431 -0.573315 0
10000 rows × 5 columns
pd.read_csv('pydata-book-2nd-edition\examples\ex6.csv', nrows=5) # 5
one two three four key
0 0.467976 -0.038649 -0.295344 -1.824726 L
1 -0.358893 1.404453 0.704965 -0.200638 B
2 -0.501840 0.659254 -0.421691 -0.057688 G
3 0.204886 1.074134 1.388361 -0.982404 R
4 0.354628 -0.133116 0.283763 -0.837063 Q
b. chunksize 블록은 파일을 읽고 반복합니다.
chunker = pd.read_csv('pydata-book-2nd-edition\examples\ex6.csv', chunksize=1000)
type(chunker)
pandas.io.parsers.TextFileReader
tot = pd.Series([ ])
for piece in chunker:
tot = tot.add(piece['key'].value_counts(), fill_value=0)
tot = tot.sort_values(ascending=False)
tot[:10]
E 368.0
X 364.0
L 346.0
O 343.0
Q 340.0
M 338.0
J 337.0
F 335.0
K 334.0
H 330.0
dtype: float64
TextParser에는 get 도 있습니다.chunk 방법으로 데이터 블록을 임의의 크기로 읽을 수 있습니다.
1.3 텍스트 형식에 데이터 쓰기
data.to_csv('out.csv') #
,something,a,b,c,d,message
0,one,1,2,3.0,4,
1,two,5,6,,8,world
2,three,9,10,11.0,12,foo
다른 구분자도 괜찮아요.
import sys
data.to_csv(sys.stdout, sep='|')
|something|a|b|c|d|message
0|one|1|2|3.0|4|
1|two|5|6||8|world
2|three|9|10|11.0|12|foo
누락된 값은 내보낼 때 빈 문자열로 나타나거나 다른 식별 값을 설정할 수 있습니다.
data.to_csv(sys.stdout, na_rep='NULL')
,something,a,b,c,d,message
0,one,1,2,3.0,4,NULL
1,two,5,6,NULL,8,world
2,three,9,10,11.0,12,foo
data.to_csv(sys.stdout, index=False, header=False) # ,
one,1,2,3.0,4,
two,5,6,,8,world
three,9,10,11.0,12,foo
data.to_csv(sys.stdout, index=False, columns=['a', 'b', 'c']) #
a,b,c
1,2,3.0
5,6,
9,10,11.0
1.4 구분 형식 사용
단일 문자 구분자가 있는 파일은 열려 있는 파일이나 파일형 대상을 csv에 전송합니다.reader, Reader를 옮겨다니면 모듈이 생성되며, 필요에 따라 특정 형식의 데이터 파일을 생성할 수 있습니다.
import csv
with open('pydata-book-2nd-edition/examples/ex7.csv') as f:
lines = list(csv.reader(f))
header, values = lines[0], lines[1:]
data_dict = {
h: v for h, v in zip(header, zip(*values))}
data_dict
{
'a': ('1', '1'), 'b': ('2', '2'), 'c': ('3', '3')}
1.5 JSON 데이터
JSON은 웹 브라우저와 다른 응용 프로그램 간에 HTTP를 통해 데이터를 보내는 표준 형식이 되었고 CSV 등 표 텍스트 형식보다 자유로운 데이터 형식이 되었다.JSON 객체의 모든 키는 문자열이어야 합니다.
obj = """
{"name": "Wes",
"places_lived": ["United States", "Spain", "Germany"],
"pet": null,
"siblings": [{"name": "Scott", "age": 30, "pets": ["Zeus", "Zuko"]},
{"name": "Katie", "age": 38,
"pets": ["Sixes", "Stache", "Cisco"]}]
}
"""
result = json.loads(obj) # JSON Python
result
{
'name': 'Wes',
'places_lived': ['United States', 'Spain', 'Germany'],
'pet': None,
'siblings': [{
'name': 'Scott', 'age': 30, 'pets': ['Zeus', 'Zuko']},
{
'name': 'Katie', 'age': 38, 'pets': ['Sixes', 'Stache', 'Cisco']}]}
siblings = pd.DataFrame(result["siblings"], columns=['name', 'age', 'pets'])
siblings
name age pets
0 Scott 30 [Zeus, Zuko]
1 Katie 38 [Sixes, Stache, Cisco]
asjson = json.dumps(result) # Python JSON
read_json은 자동으로 JSON 객체를 시리즈 또는 DataFrame으로 순서대로 변환할 수 있습니다.
! type example.json
[{
"a": 1, "b": 2, "c": 3},
{
"a": 4, "b": 5, "c": 6},
{
"a": 7, "b": 8, "c": 9}]
data = pd.read_json('example.json') # JSON
a b c
0 1 2 3
1 4 5 6
2 7 8 9
to_json 방법은pandas 데이터를 JSON으로 내보낼 수 있습니다
print(data.to_json())
{
"a":{
"0":1,"1":4,"2":7},"b":{
"0":2,"1":5,"2":8},"c":{
"0":3,"1":6,"2":9}}
print(data.to_json(orient='records')) # ,
[{
"a":1,"b":2,"c":3},{
"a":4,"b":5,"c":6},{
"a":7,"b":8,"c":9}]
1.6 XML 및 HTML:웹 캡처
파이썬에는 HTML과 XML 형식을 읽고 쓸 수 있는 라이브러리가 많은데, 예를 들어 lxml, Beautiful Soup, html5lib lxml은 상대적으로 빠르지만, 다른 라이브러리는 이상한 HTML이나 XML 파일을 더 잘 처리할 수 있다.a. read_html 함수는 HTML의 테이블을 DataFrame 객체 b.lxml로 자동으로 해석합니다.Objectify 해석 XML
2. 바이너리 형식
pickle 서열화 모듈은 2진 형식 조작을 할 수 있으며 데이터 저장(서열화라고 부른다)을 가장 효율적이고 편리하게 하는 방식 중 하나이다.
frame = pd.read_csv('pydata-book-2nd-edition/examples/ex1.csv')
frame
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
frame.to_pickle('pydata-book-2nd-edition/examples/frame_pickle')
pandas 내장은 HDF5와 MessagePack 두 개의 이진 형식을 지원합니다.
a. HDF5 형식 HDF5는 대량의 과학적 배열 데이터를 저장하는 데 사용되며, HDF는 계층형 데이터 형식을 나타내며, HDF5 파일마다 여러 개의 데이터 세트를 저장하고 메타데이터를 지원합니다.메모리에 저장되지 않는 초대형 데이터를 처리하는 데 적합하며, 대형 그룹의 작은 부분을 효율적으로 읽을 수 있다.HDF5는 데이터베이스가 아니라 한 번에 여러 번 쓰기에 적합한 데이터 세트입니다.
b. Excel 파일 읽기 pandas는 ExcelFile 클래스 또는 read 를 통해 지원excel 함수는 excel 파일의 표 데이터를 읽습니다. xlrd와openyxl 도구를 설치해야 합니다.
xlsx = pd.ExcelFile('pydata-book-2nd-edition/examples/ex1.xlsx') # ExcelFile
pd.read_excel(xlsx, "Sheet1")
Unnamed: 0 a b c d message
0 0 1 2 3 4 hello
1 1 5 6 7 8 world
2 2 9 10 11 12 foo
frame = pd.read_excel('pydata-book-2nd-edition/examples/ex1.xlsx', "Sheet1")
frame
Unnamed: 0 a b c d message
0 0 1 2 3 4 hello
1 1 5 6 7 8 world
2 2 9 10 11 12 foo
pandas 데이터를 excel 파일에 쓰려면 ExcelWriter를 만들고 to 를 사용해야 합니다excel 메서드:
writer = pd.ExcelWriter('pydata-book-2nd-edition/examples/ex2.xlsx')
frame.to_excel(writer, "Sheet1")
writer.save()
to 에 파일 경로를 전송할 수도 있습니다.excel, ExcelWriter를 직접 호출하지 마십시오.
frame.to_excel('pydata-book-2nd-edition/examples/ex2.xlsx')
3. 웹 API와 상호 작용
많은 사이트에서 API를 공개하여 JSON이나 다른 형식을 통해 데이터 서비스를 제공하고 리퀘스트 패키지로 HTTP GET 요청을 보내면 로컬 Python 대상으로 해석된 JSON 사전을 되돌려줍니다.
import requests
url = 'https://api.github.com/repos/pandas-dev/pandas/issues'
resp = requests.get(url) # get
data = resp.json() # response json
pd.DataFrame(data, columns=['number', 'title', 'labels', 'state'])
4. 데이터베이스와 상호작용
데이터베이스 테이블에서 데이터를 선택할 때 대부분의 Python의 SQL 드라이브는 원조의 목록을 되돌려줍니다.pandas의readql 함수는 일반적인 SQLAlchemy 연결에서 데이터를 쉽게 읽을 수 있도록 합니다.
import sqlite3
query = """
CREATE TABLE test
(a VARCHAR(20), b VARCHAR(20),
c REAL, d INTEGER
);"""
con = sqlite3.connect('mydata.sqlite')
con.execute(query)
con.commit()
data = [('Atlanta', 'Georgia', 1.25, 6),
('Tallahassee', 'Florida', 2.6, 3),
('Sacramento', 'California', 1.7, 5)]
stmt = "INSERT INTO test VALUES(?, ?, ?, ?)"
con.executemany(stmt, data)
con.commit()