原文來源:http://pbpython.com/pandas-list-dict.html
介紹
每當我使用pandas進行分析時,我的第一個目標是使用眾多可用選項中的一個將數據導入Pandas的DataFrame 。
對於絕大多數情況下,我使用的 read_excel , read_csv 或 read_sql 。
但是,有些情況下我只需要幾行數據或包含這些數據里的一些計算。
在這些情況下,了解如何從標准python列表或字典創建DataFrames會很有幫助。
基本過程並不困難,但因為有幾種不同的選擇,所以有助於理解每種方法的工作原理。
我永遠記不住我是否應該使用 from_dict , from_records , from_items 或默認的 DataFrame 構造函數。
通常情況下,通過一些反復試驗和錯誤,我能搞定它。但由於它仍然讓我感到困惑,我想我會通過以下幾個例子來澄清這些不同的方法。
在本文的最后,我簡要介紹了在生成Excel報表時如何使用它。
從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)
使用此方法,您可以獲得與上面相同的結果。需要考慮的關鍵點是哪種方法更容易理解您獨特的使用場景。
有時,以面向行的方式獲取數據更容易,而其他時候以列為導向的則更容易。
了解這些選項將有助於使您的代碼更簡單,更易於理解,以滿足您的特定需求。
大多數人會注意到列的順序看起來不對。這個問題出現的原因是標准的python字典不保留其鍵的順序。
如果要控制列順序,則有兩種方式。
第一種,您可以手動重新排序列:
df = df[['account', 'Jan', 'Feb', 'Mar']]
或者你可以使用python中的OrderedDict 創建你的有序字典 。
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等。
這種靈活性對於臨時報告生成非常方便。