[译]从列表或字典创建Pandas的DataFrame对象
原文来源: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等。
这种灵活性对于临时报告生成非常方便。
[译]从列表或字典创建Pandas的DataFrame对象的更多相关文章
- 重拾Python(4):Pandas之DataFrame对象的使用
Pandas有两大数据结构:Series和DataFrame,之前已对Series对象进行了介绍(链接),本文主要对DataFrame对象的常用用法进行总结梳理. 约定: import pandas ...
- 二. 创建Series和DataFrame对象
创建对象 创建Series对象 Series可以通过列表,标量值,字典,ndarray,其他函数来创建 a = pf.Series([1,2,3,4]) # 列表创建 b = pd.Series(25 ...
- pandas中DataFrame对象to_csv()方法中的encoding参数
当使用pd.read_csv()方法读取csv格式文件的时候,常常会因为csv文件中带有中文字符而产生字符编码错误,造成读取文件错误,在这个时候,我们可以尝试将pd.read_csv()函数的enco ...
- 将pandas的Dataframe对象读写Excel文件
Dataframe对象生成Excel文件 需要xlrd库 命令 pip install xlrd #导入pandas import pandas as pd import numpy as np ...
- Python学习笔记——基础篇【第二周】——解释器、字符串、列表、字典、主文件判断、对象
目录 1.Python介绍 2.Python编码 3.接受执行传参 4.基本数据类型常用方法 5.Python主文件判断 6.一切事物都是对象 7. int内部功能介绍 8.float和long内 ...
- 利用sqlalchemy读取数据库 和pandas的Dataframe对象 互相生成
#导入pandas import pandas as pd import numpy as np #导入SqlAlchemy from sqlalchemy import create_engine ...
- Pandas 数据结构Dataframe:基本概念及创建
"二维数组"Dataframe:是一个表格型的数据结构,包含一组有序的列,其列的值类型可以是数值.字符串.布尔值等. Dataframe中的数据以一个或多个二维块存放,不是列表.字 ...
- python整理之(字符串、元组、列表、字典)
一.关于字符串的整理总结 对于字符串的操作常用的有这些: 字符串的操作通过dir()函数可以查看 我们先整理没有下划线的用法,有下划线的暂时不去考虑. 1.capitalize 功能:使字符串的首字母 ...
- python容器类型:列表,字典,集合等
容器的概念我是从C++的STL中学到的 什么是容器? 容器是用来存储和组织其他对象的对象. 也就是说容器里面可以放很多东西,这些东西可以是字符串,可以是整数,可以是自定义类型,然后把这些东西有组织的存 ...
随机推荐
- PHP与MYSQL结合操作——文章发布系统小项目(实现基本增删查改操作)
php和mysql在一起几十年了,也是一对老夫老妻了,最近正在对他们的爱情故事进行探讨,并做了一个很简单的小东西——文章发布系统,目的是为了实现mysql对文章的基本增删查改操作 前台展示系统有:文章 ...
- [Hack] 搭建渗透测试实验环境
安装虚拟机镜像,镜像如下: Kali-Linux-2016.1-vm-amd64(https://www.kali.org/) Metasploitable2-Linux(https://source ...
- selenium显示等待解决浏览器未加载完成查找控件的问题
问题描述:wap版支付成功后,跳转到支付成功页,查找的元素已出现,如图的:元素1,元素2,但是提示查找的元素超时,失败,并且每到这个页面都会报页面超时,不能查找到页面元素 原始代码: try{ op. ...
- python __getattr__ __setattr__
class Rectangle: def __init__(self): self.width = 0 self.height = 0 def __setattr__(self, key, value ...
- Python监控日志中经常访问的ip
一.需求:每分钟检查一次日志文件,如果这一分钟内同一个ip请求次数超过200次,加入黑名单 1.日志文件中,每一行的格式为:XXX.XXX.XXX.XXX - - [04/Jun/2017:05:25 ...
- InstallShield Limited Edition for Visual Studio 2013 图文教程打包安装包
http://www.wuleba.com/23892.html 从Visual Studio 2012开始,微软就把自家原来的安装与部署工具彻底废掉了,转而让大家去安装使用第三方的打包工具“Inst ...
- C#进阶之全面解析Lambda表达式
引言 在实际的项目中遇到一个问题,我们经常在网上搜索复制粘贴,其中有些代码看着非常的简洁,比如Lambda表达式,但是一直没有去深入了解它的由来,以及具体的使用方法,所以在使用的时候比较模糊,其次,编 ...
- C#设计模式原则
原则的诞生:面向对象:封装.继承.多态三大支柱蕴含了用抽象来封装变化,降低耦合,实现复用的精髓: 封装:隐藏内部的实现,保护内部信息: 继承:实现复用,归纳共性: 多态:改写对象行为,实现更高级别的继 ...
- ZRDay6A. 萌新拆塔(三进制状压dp)
题意 Sol 这好像是我第一次接触三进制状压 首先,每次打完怪之后吃宝石不一定是最优的,因为有模仿怪的存在,可能你吃完宝石和他打就GG了.. 因此我们需要维护的状态有三个 0:没打 1:打了怪物 没吃 ...
- 十一、Shell 输入/输出重定向
Shell 输入/输出重定向 大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端.一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端.同样,一个命令 ...