您好,登錄后才能下訂單哦!
介紹
每當(dāng)我使用pandas進(jìn)行分析時(shí),我的第一個(gè)目標(biāo)是使用眾多可用選項(xiàng)中的一個(gè)將數(shù)據(jù)導(dǎo)入Pandas的DataFrame 。
對(duì)于絕大多數(shù)情況下,我使用的 read_excel , read_csv 或 read_sql 。
但是,有些情況下我只需要幾行數(shù)據(jù)或包含這些數(shù)據(jù)里的一些計(jì)算。
在這些情況下,了解如何從標(biāo)準(zhǔn)python列表或字典創(chuàng)建DataFrames會(huì)很有幫助。
基本過(guò)程并不困難,但因?yàn)橛袔追N不同的選擇,所以有助于理解每種方法的工作原理。
我永遠(yuǎn)記不住我是否應(yīng)該使用 from_dict , from_records , from_items 或默認(rèn)的 DataFrame 構(gòu)造函數(shù)。
通常情況下,通過(guò)一些反復(fù)試驗(yàn)和錯(cuò)誤,我能搞定它。但由于它仍然讓我感到困惑,我想我會(huì)通過(guò)以下幾個(gè)例子來(lái)澄清這些不同的方法。
在本文的最后,我簡(jiǎn)要介紹了在生成Excel報(bào)表時(shí)如何使用它。
從Python的數(shù)據(jù)結(jié)構(gòu)中生成DataFrame
您可以使用多種方法來(lái)獲取標(biāo)準(zhǔn)python數(shù)據(jù)結(jié)構(gòu)并創(chuàng)建Pandas的DataFrame。
出于這些示例的目的,我將為3個(gè)虛構(gòu)公司創(chuàng)建一個(gè)包含3個(gè)月銷售信息的DataFrame。
字典
在展示下面的示例之前,我假設(shè)已執(zhí)行以下導(dǎo)入:
import pandas as pd from collections import OrderedDict from datetime import date
從python創(chuàng)建DataFrame的“默認(rèn)”方式是使用字典列表。在這種情況下,每個(gè)字典鍵用于列標(biāo)題。將自動(dòng)創(chuàng)建默認(rèn)索引:
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)
如您所見(jiàn),這種方法非?!懊嫦蛐小薄H绻胍浴懊嫦蛄小钡姆绞絼?chuàng)建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)
使用此方法,您可以獲得與上面相同的結(jié)果。需要考慮的關(guān)鍵點(diǎn)是哪種方法更容易理解您獨(dú)特的使用場(chǎng)景。
有時(shí),以面向行的方式獲取數(shù)據(jù)更容易,而其他時(shí)候以列為導(dǎo)向的則更容易。
了解這些選項(xiàng)將有助于使您的代碼更簡(jiǎn)單,更易于理解,以滿足您的特定需求。
大多數(shù)人會(huì)注意到列的順序看起來(lái)不對(duì)。這個(gè)問(wèn)題出現(xiàn)的原因是標(biāo)準(zhǔn)的python字典不保留其鍵的順序。
如果要控制列順序,則有兩種方式。
第一種,您可以手動(dòng)重新排序列:
df = df[['account', 'Jan', 'Feb', 'Mar']]
或者你可以使用python中的OrderedDict 創(chuàng)建你的有序字典 。
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)
這兩種方法都會(huì)按照您可能期望的順序?yàn)槟峁┙Y(jié)果。
由于我在下面概述的原因,我傾向于專門(mén)重新排序我的列,盡管使用OrderedDict一直是一個(gè)很好理解的選項(xiàng)。
列表
從python創(chuàng)建DataFrame的另一個(gè)選擇是將數(shù)據(jù)包含在列表結(jié)構(gòu)中。
第一種方法是使用pandas進(jìn)行面向行的方法 from_records 。此方法類似于字典方法,但您需要顯式調(diào)出列標(biāo)簽。
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 面向列的,實(shí)際上看起來(lái)類似于 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)
這兩個(gè)示例都將生成以下DataFrame:
各種選項(xiàng)的直觀總結(jié)
為了保持各種選項(xiàng)在我的腦海中清晰,我將這個(gè)簡(jiǎn)單的圖形放在一起,以顯示字典與列表選項(xiàng)以及行與列導(dǎo)向的方法。
這是一個(gè)2X2的網(wǎng)格,所以我希望所有來(lái)詢問(wèn)的人都留下深刻的印象!
為簡(jiǎn)單起見(jiàn),我沒(méi)有展示 OrderedDict 方法,因?yàn)檫@種 from_items 方法可能更像是一個(gè)現(xiàn)實(shí)世界的解決方案。
如果這有點(diǎn)難以閱讀,您也可以獲得PDF版本。
簡(jiǎn)單的例子
對(duì)于一個(gè)簡(jiǎn)單的概念,這似乎有很多解釋。
但是,我經(jīng)常使用這些方法來(lái)構(gòu)建小型DataFrame,并將其與更復(fù)雜的分析結(jié)合起來(lái)。
舉一個(gè)例子,假設(shè)我們要保存我們的DataFrame并包含一個(gè)頁(yè)腳,以便我們知道它何時(shí)被創(chuàng)建以及它是由誰(shuí)創(chuàng)建的。
如果我們填充DataFrame并將其寫(xiě)入Excel比我們嘗試將單個(gè)單元格寫(xiě)入Excel更容易。
拿我們現(xiàn)有的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)
現(xiàn)在構(gòu)建一個(gè)頁(yè)腳(以列為導(dǎo)向):
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)
合并進(jìn)入一個(gè)Excel中的一個(gè)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 在銷售數(shù)據(jù)框架下面寫(xiě)入頁(yè)腳DataFrame。還有一個(gè)相應(yīng)的startcol,所以你可以控制成為你想要的列布局。
這使得基本 to_excel 功能具有很大的靈活性。
總結(jié)
大多數(shù)Pandas用戶很快就熟悉了電子表格,CSV和SQL數(shù)據(jù)的攝取。
但是,有時(shí)您會(huì)在基本列表或字典中包含數(shù)據(jù)并希望填充DataFrame。
Pandas提供了幾種選擇,但可能并不總是立即明確何時(shí)使用哪種選擇。
沒(méi)有一種方法是“最好的”,它實(shí)際上取決于您的需求。
我傾向于喜歡基于列表的方法,因?yàn)槲彝ǔjP(guān)心排序,列表確保我保留順序。
最重要的是要知道這些選項(xiàng)是可用的,這樣您就可以聰明地使用最簡(jiǎn)單的選項(xiàng)來(lái)滿足您的特定情況。
從表面上看,這些代碼樣例看似簡(jiǎn)單,但我發(fā)現(xiàn)使用這些方法生成快速的信息片非常常見(jiàn),他們可以增加或澄清更復(fù)雜的分析。
DataFrame中數(shù)據(jù)的好處在于它很容易轉(zhuǎn)換為其他格式,如Excel,CSV, HTML,LaTeX等。
這種靈活性對(duì)于臨時(shí)報(bào)告生成非常方便。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。