[译]从列表或字典建立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等。这种灵活性对于临时报告生成很是方便。

相关文章
相关标签/搜索