[譯]從列表或字典建立Pandas的DataFrame對象

介紹

每當我使用pandas進行分析時,個人第一個目標是使用衆多可用選項中的一個將數據導入Pandas的DataFrame 。
對於絕大多數狀況下,我使用的 read_excel , read_csv 或 read_sql 。python

可是,有些狀況下我只須要幾行數據或包含這些數據裏的一些計算。
在這些狀況下,瞭解如何從標準python列表或字典建立DataFrames會頗有幫助。
基本過程並不困難,但由於有幾種不一樣的選擇,因此有助於理解每種方法的工做原理。
我永遠記不住我是否應該使用 from_dict , from_records , from_items 或默認的 DataFrame 構造函數。
一般狀況下,經過一些反覆試驗和錯誤,我能搞定它。但因爲它仍然讓我感到困惑,我想我會經過如下幾個例子來澄清這些不一樣的方法。
在本文的最後,我簡要介紹了在生成Excel報表時如何使用它。sql

從Python的數據結構中生成DataFrame

您可使用多種方法來獲取標準python數據結構並建立Pandas的DataFrame。
出於這些示例的目的,我將爲3個虛構公司建立一個包含3個月銷售信息的DataFrame。
數據結構

字典

在展現下面的示例以前,我假設已執行如下導入:框架

import pandas as pd
from collections import OrderedDict
from datetime import date

從python建立DataFrame的「默認」方式是使用字典列表。在這種狀況下,每一個字典鍵用於列標題。將自動建立默認索引:函數

sales = [{'account': 'Jones LLC', 'Jan': 150, 'Feb': 200, 'Mar': 140},
         {'account': 'Alpha Co',  'Jan': 200, 'Feb': 210, 'Mar': 215},
         {'account': 'Blue Inc',  'Jan': 50,  'Feb': 90,  'Mar': 95 }]
df = pd.DataFrame(sales)


如您所見,這種方法很是「面向行」。若是您想以「面向列」的方式建立DataFrame,您可使用 from_dict佈局

sales = {'account': ['Jones LLC', 'Alpha Co', 'Blue Inc'],
         'Jan': [150, 200, 50],sheng cheng
         'Feb': [200, 210, 90],
         'Mar': [140, 215, 95]}
df = pd.DataFrame.from_dict(sales)

使用此方法,您能夠得到與上面相同的結果。須要考慮的關鍵點是哪一種方法更容易理解您獨特的使用場景。
有時,以面向行的方式獲取數據更容易,而其餘時候以列爲導向的則更容易。
瞭解這些選項將有助於使您的代碼更簡單,更易於理解,以知足您的特定需求。spa

大多數人會注意到列的順序看起來不對。這個問題出現的緣由是標準的python字典不保留其鍵的順序。
若是要控制列順序,則有兩種方式。3d

第一種,您能夠手動從新排序列:excel

df = df[['account', 'Jan', 'Feb', 'Mar']]

或者你可使用python中的OrderedDict 建立你的有序字典 。code

sales = OrderedDict([ ('account', ['Jones LLC', 'Alpha Co', 'Blue Inc']),
          ('Jan', [150, 200, 50]),
          ('Feb',  [200, 210, 90]),
          ('Mar', [140, 215, 95]) ] )
df = pd.DataFrame.from_dict(sales)

這兩種方法都會按照您可能指望的順序爲您提供結果。

因爲我在下面概述的緣由,我傾向於專門從新排序個人列,儘管使用OrderedDict一直是一個很好理解的選項。

列表

從python建立DataFrame的另外一個選擇是將數據包含在列表結構中。
第一種方法是使用pandas進行面向行的方法 from_records 。此方法相似於字典方法,但您須要顯式調出列標籤。

sales = [('Jones LLC', 150, 200, 50),
         ('Alpha Co', 200, 210, 90),
         ('Blue Inc', 140, 215, 95)]
labels = ['account', 'Jan', 'Feb', 'Mar']
df = pd.DataFrame.from_records(sales, columns=labels)

第二種方法是 from_items 面向列的,實際上看起來相似於 OrderedDict 上面的例子。

sales = [('account', ['Jones LLC', 'Alpha Co', 'Blue Inc']),
         ('Jan', [150, 200, 50]),
         ('Feb', [200, 210, 90]),
         ('Mar', [140, 215, 95]),
         ]
df = pd.DataFrame.from_items(sales)

這兩個示例都將生成如下DataFrame:

各類選項的直觀總結

爲了保持各類選項在個人腦海中清晰,我將這個簡單的圖形放在一塊兒,以顯示字典與列表選項以及行與列導向的方法。
這是一個2X2的網格,因此我但願全部來詢問的人都留下深入的印象!

爲簡單起見,我沒有展現 OrderedDict 方法,由於這種 from_items 方法可能更像是一個現實世界的解決方案。
若是這有點難以閱讀,您也能夠得到PDF版本。

簡單的例子

對於一個簡單的概念,這彷佛有不少解釋。
可是,我常用這些方法來構建小型DataFrame,並將其與更復雜的分析結合起來。

舉一個例子,假設咱們要保存咱們的DataFrame幷包含一個頁腳,以便咱們知道它什麼時候被建立以及它是由誰建立的。
若是咱們填充DataFrame並將其寫入Excel比咱們嘗試將單個單元格寫入Excel更容易。

拿咱們現有的DataFrame:

sales = [('account', ['Jones LLC', 'Alpha Co', 'Blue Inc']),
         ('Jan', [150, 200, 50]),
         ('Feb', [200, 210, 90]),
         ('Mar', [140, 215, 95]),
         ]
df = pd.DataFrame.from_items(sales)

如今構建一個頁腳(以列爲導向):

from datetime import date

create_date = "{:%m-%d-%Y}".format(date.today())
created_by = "CM"
footer = [('Created by', [created_by]), ('Created on', [create_date]), ('Version', [1.1])]
df_footer = pd.DataFrame.from_items(footer)


合併進入一個Excel中的一個sheet:

writer = pd.ExcelWriter('simple-report.xlsx', engine='xlsxwriter')
df.to_excel(writer, index=False)
df_footer.to_excel(writer, startrow=6, index=False)
writer.save()


這裏的祕訣是使用 startrow 在銷售數據框架下面寫入頁腳DataFrame。還有一個相應的startcol,因此你能夠控制成爲你想要的列布局。
這使得基本 to_excel 功能具備很大的靈活性。

總結

大多數Pandas用戶很快就熟悉了電子表格,CSV和SQL數據的攝取。
可是,有時您會在基本列表或字典中包含數據並但願填充DataFrame。
Pandas提供了幾種選擇,但可能並不老是當即明確什麼時候使用哪一種選擇。

沒有一種方法是「最好的」,它實際上取決於您的需求。
我傾向於喜歡基於列表的方法,由於我一般關心排序,列表確保我保留順序。
最重要的是要知道這些選項是可用的,這樣您就能夠聰明地使用最簡單的選項來知足您的特定狀況。

從表面上看,這些代碼樣例看似簡單,但我發現使用這些方法生成快速的信息片很是常見,他們能夠增長或澄清更復雜的分析。DataFrame中數據的好處在於它很容易轉換爲其餘格式,如Excel,CSV, HTML,LaTeX等。這種靈活性對於臨時報告生成很是方便。

相關文章
相關標籤/搜索