原文来源: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对象的更多相关文章

  1. 重拾Python(4):Pandas之DataFrame对象的使用

    Pandas有两大数据结构:Series和DataFrame,之前已对Series对象进行了介绍(链接),本文主要对DataFrame对象的常用用法进行总结梳理. 约定: import pandas ...

  2. 二. 创建Series和DataFrame对象

    创建对象 创建Series对象 Series可以通过列表,标量值,字典,ndarray,其他函数来创建 a = pf.Series([1,2,3,4]) # 列表创建 b = pd.Series(25 ...

  3. pandas中DataFrame对象to_csv()方法中的encoding参数

    当使用pd.read_csv()方法读取csv格式文件的时候,常常会因为csv文件中带有中文字符而产生字符编码错误,造成读取文件错误,在这个时候,我们可以尝试将pd.read_csv()函数的enco ...

  4. 将pandas的Dataframe对象读写Excel文件

    Dataframe对象生成Excel文件 需要xlrd库  命令  pip install xlrd #导入pandas import pandas as pd import numpy as np ...

  5. Python学习笔记——基础篇【第二周】——解释器、字符串、列表、字典、主文件判断、对象

    目录 1.Python介绍 2.Python编码 3.接受执行传参 4.基本数据类型常用方法 5.Python主文件判断 6.一切事物都是对象 7.   int内部功能介绍 8.float和long内 ...

  6. 利用sqlalchemy读取数据库 和pandas的Dataframe对象 互相生成

    #导入pandas import pandas as pd import numpy as np #导入SqlAlchemy from sqlalchemy import create_engine ...

  7. Pandas 数据结构Dataframe:基本概念及创建

    "二维数组"Dataframe:是一个表格型的数据结构,包含一组有序的列,其列的值类型可以是数值.字符串.布尔值等. Dataframe中的数据以一个或多个二维块存放,不是列表.字 ...

  8. python整理之(字符串、元组、列表、字典)

    一.关于字符串的整理总结 对于字符串的操作常用的有这些: 字符串的操作通过dir()函数可以查看 我们先整理没有下划线的用法,有下划线的暂时不去考虑. 1.capitalize 功能:使字符串的首字母 ...

  9. python容器类型:列表,字典,集合等

    容器的概念我是从C++的STL中学到的 什么是容器? 容器是用来存储和组织其他对象的对象. 也就是说容器里面可以放很多东西,这些东西可以是字符串,可以是整数,可以是自定义类型,然后把这些东西有组织的存 ...

随机推荐

  1. GetIPAddress——获得本地IP地址信息

    1.gethostname()需要初始化套接字库 加载#pragma comment(lib,"ws2_32.lib"),和WSAStartup(MAKEWORD(2,2),&am ...

  2. UOJ#122【NOI2013】树的计数

    [NOI2013]树的计数 链接:http://uoj.ac/problem/122 按BFS序来,如果$B_i$与$B_{i-1}$必须在同一层,那么贡献为0,必须在不同层那么贡献为1,都可以贡献为 ...

  3. selenium跳过https的问题

    背景: 周六产品给我反馈:支付成功页面后会提示这个,问自动化为什么没有发现这样的问题 第一反应:这个地址肯定被举报了,我也肯定没有设置过安全链接,因为都没有见过这样的网址,如果有问题,应该会直接出错, ...

  4. UVALive 4727 Jump(约瑟夫环,递推)

    分析: 如果问题是要求最后一个删除的数,重新编号为0到n-1,f[n]表示答案,那么f[n] = (f[n-1]+k)%n. 因为删掉下标k-1以后可以从下标k重新编号为0. 在这个问题只需要推出最后 ...

  5. 【BZOJ1087】[SCOI2005] 互不侵犯King(状压DP)

    点此看题面 大致题意: 在\(N×N\)的棋盘里面放\(K\)个国王,使他们互不攻击,共有多少种摆放方案(国王能攻击到它周围的8个格子). 状压\(DP\) 一看到这道题我就想到了经典的八皇后问题,但 ...

  6. 软件杯python-flask遇到的坑有感!

    大三下,对于我考研的人来说,时间不要太紧张,参加软件杯也是系主任要求,题目是公共地点人流量的检测,个人还是个菜鸟,但是把遇到的一些大家可能不小心会出现的问题贴出来,困扰我很久,还没睡好觉!!! Que ...

  7. SummerVocation_Learning--java的自动打包与解包

    Auto Boxing: 自动将基础类型转换成对象(JDK1.5之后支持) Auto UnBoxing:自动将对象转换成基础类型 如 Map中的put方法,如果要传入键值对<a,1>,&l ...

  8. linux中搭建公网ftp服务器

    Linux搭建ftp服务器汇总整理 一.检查linux中是否已经安装vsftpd服务端软件 rpm -qa |grep vsftpd 二.卸载linux中的vsftpd服务端软件 rpm -e vsf ...

  9. 三 python并发编程之多线程-重点

    一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 二 开启线程的两种方式 #方式一 from th ...

  10. Pycharm中F4查看函数的相关小BUG

    我们都知道在Pycharm中我们要快速查看某个函数或者模块的源码,可以在该函数上按F4快捷键,其可以打开源码相关的.py文件,这两天偶然发现起打开的文件不一定是对的. -代码如下: import os ...