數據分析從零開始實戰 (三)

  • 2020 年 2 月 13 日
  • 筆記

閱讀文本大概需要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'data01realEstate_trans.xlsx'  # 數據保存路徑  wpath_excel = father_path+r'data01temp_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'data01realEstate_trans.xml'  # 數據保存路徑  wpath_xml = father_path+r'data01temp_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、少喊口號,多做實事。本來我是很推崇做個人規劃的,但是,我發現不止是我周邊和某些讀者朋友,包括我自己,規劃作的越來越假大空,規劃本身沒有錯,錯的是:現實生活中我們把規劃變成了日日口號,而為能如實完成,所以我現在推崇:規劃,先做再說。

【完】