資料分析從零開始實戰 | 基礎篇(三)

極簡XksA發表於2019-03-01

閱讀文字大概需要12分鐘。


零、寫在前面

前面兩篇文章基礎篇(一)基礎篇(二)講了資料分析虛擬環境建立和pandas讀寫csv、tsv、json格式的資料,今天我們繼續探索pandas讀取資料。
本系列學習筆記參考書籍:《資料分析實戰》托馬茲·卓巴斯

一、基本知識概要

1.利用pandas讀寫Excel檔案
2.利用pandas讀寫XML檔案

二、開始動手動腦

1.利用Python讀寫Excel

讀取,利用Pandas庫的ExcelFile()方法。
寫入,利用

程式碼

import pandas as pd
import os

# 獲取當前檔案父目錄路徑
father_path = os.getcwd()
# 原始資料檔案路徑
rpath_excel = father_path+r'\data01\realEstate_trans.xlsx'
# 資料儲存路徑
wpath_excel = father_path+r'\data01\temp_excel.xlsx

# 開啟excel檔案
excel_file = pd.ExcelFile(rpath_excel)

# 讀取檔案內容
"""
ExcelFile物件的parse()方法讀取指定工作表的內容
ExcelFile物件的sheet_names屬性可以獲取Excel檔案中的所有工作表
這裡還用到了字典表示式來給字典賦值(看起來更加優雅)
"""
excel_read = {sheetName : excel_file.parse(sheetName) for sheetName in excel_file.sheet_names}

# 輸出Sacramento表格的price列的頭10行記錄
print(excel_read['
Sacramento'].head(10)['price'])
print(type(excel_read['
Sacramento'].head(10)['price']))
# 遇到錯誤:ModuleNotFoundError: No module named '
xlrd'

# 寫入表格的price列的前10行
excel_read['
Sacramento'].head(10)['price'].to_excel(wpath_excel, "price", index=False)
# 遇到錯誤:ModuleNotFoundError: No module named '
openpyxl'

讀取結果:


資料分析從零開始實戰 | 基礎篇(三)
寫入結果:
資料分析從零開始實戰 | 基礎篇(三)
可能報錯:

讀操作時:
ModuleNotFoundError: No module named 'xlrd'
寫操作時:
ModuleNotFoundError: No module named 'openpyxl'

解決方法:

# 在環境裡安裝xlrd和openpyxl模組即可
pip install xlrd
pip install openpyxl

2.利用Python讀寫XML檔案

學過java的同學對XML應該不陌生,全稱是eXtensible Markup Language(擴充套件標記語言),雖然平時不常見,但是Web API裡支援XML編碼。

讀寫程式碼

import pandas as pd
# 一個輕量的XML解析器
import xml.etree.ElementTree as ET
import os

"""
    讀入XML資料,返回pa.DataFrame
"""

def read_xml(xml_FileName):
    with open(xml_FileName, "r"as xml_file:
        # 讀取資料,以樹的結構儲存
        tree = ET.parse(xml_file)
        # 訪問樹的梗節點
        root = tree.getroot()
        # 返回DataFrame格式資料
        return pd.DataFrame(list(iter_records(root)))

"""
    遍歷有記錄的生成器
"""

def iter_records(records):
    for record in records   :
        # 儲存值的臨時字典
        temp_dict = {}
        # 遍歷所有欄位
        for var in record:
            temp_dict[
                var.attrib["var_name"]
            ] = var.text
        # 生成值
        yield temp_dict

"""
    以XML格式儲存資料
"""

def write_xml(xmlFileName, data):
    with open(xmlFileName, "w"as xmlFile:
        # 寫頭部
        xmlFile.write(
            '<?xml version="1.0" encoding="UTF-8"?>'
        )
        xmlFile.write('<records>\n')
        # 寫資料
        xmlFile.write(
            '\n'.join(data.apply(xml_encode, axis=1))
        )
        # 寫尾部
        xmlFile.write("\n</records>")

"""
    以特定的巢狀格式將每一行編碼成XML
"""

def xml_encode(row):
    # 第一步--輸出record節點
    xmlItem = ['  <record>']
    # 第二步--給行中每個欄位加上XML格式<field name=···>···</field>
    for field in row.index:
        xmlItem.append(
            '<var var_name="{0}">{1}</var>'.format(field, row[field])
        )
    # 最後一步--標記record節點的結束標籤
    xmlItem.append("  </record>")
    return '\n'.join(xmlItem)


# 獲取當前檔案父目錄路徑
father_path = os.getcwd()
# 原始資料檔案路徑
rpath_xml = father_path+r'\data01\realEstate_trans.xml'
# 資料儲存路徑
wpath_xml = father_path+r'\data01\temp_xml.xml'
# 讀取資料
xml_read = read_xml(rpath_xml)
# 輸出頭10行記錄
print(xml_read.head(10))
# 以XML格式寫回檔案
write_xml(wpath_xml, xml_read.head(10))

執行結果


資料分析從零開始實戰 | 基礎篇(三)


資料分析從零開始實戰 | 基礎篇(三)
程式碼解析

(1)read_xml(xml_FileName)函式
功能:讀入XML資料,返回pa.DataFrame
這裡利用到了一個輕量級的XML解析器:xml.etree.ElementTree。傳入檔名,先讀取檔案內容,然後利用parse()函式解析XML,建立一個樹狀結構並存放在tree變數中,在tree物件上呼叫getroot()方法得到根節點,最後呼叫iter_records()函式,傳入根節點,進而將返回的資訊轉換成DataFrame。

(2)iter_records(records)函式
功能:遍歷有記錄的生成器
iter_records()方法是一個生成器,從關鍵字
yield可以看出來,如果你不瞭解生成器,可以點選這裡,與return不同,生成器每次只向主調方法返回一個值,直到結束。

(3)write_xml(xmlFile, data)函式
功能:以XML格式儲存資料
這裡需要注意的是得按XML檔案格式進行儲存,我們要做的就是三步:儲存頭部格式、按格式儲存資料、儲存尾部格式。儲存資料時用到了DataFrame物件的apply()方法,遍歷內部每一行,第一個引數xml_encode指定了要應用到每一行記錄上的方法,axis=1表示按行處理,預設值為0,表示按列處理。

(4)xml_encode(row)函式
功能:以特定的巢狀格式將每一行編碼成XML
在寫資料的過程我們會呼叫這個方法,對每行資料進行處理,變成XML格式。

三 、送你的話

昨天開了個會,然後思考了寫問題,這裡分享給大家:
1、思想覺悟,辯證思考。不要隨聲附和,要有己見,聰明的人應該是堅持輸出自己的思想,從事情本身和和他人評論去思考,再辯正自己的思考,再輸出;

2、少喊口號,多做實事。本來我是很推崇做個人規劃的,但是,我發現不止是我周邊和某些讀者朋友,包括我自己,規劃作的越來越假大空,規劃本身沒有錯,錯的是:現實生活中我們把規劃變成了日日口號,而為能如實完成,所以我現在推崇:規劃,先做再說。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31556503/viewspace-2637300/,如需轉載,請註明出處,否則將追究法律責任。

相關文章