基于 Python 和 Pandas 的数据分析(3) --- 输入/输出 基础
这一节, 我们要讨论 Pandas 的输入与输出, 并且应用在现实的实际例子中. 为了得到大量的数据, 向大家推荐一个网站 Quandl. Quandl 有很多免费和付费的资源. 这个网站最大的优势在于数据的规范化, 集中性以及提取数据的方式都是一样的. 如果你获取数据的时候, 选择用 Python, 那么数据会自动转成 dataframe. 但是, 我们这节课的目的是理解 Pandas 的输入与输出, 所以我们还是手动下载一个 CSV 文件.
举个例子, 我们想要买卖德克萨斯州的一处房产. 那里的邮政编码是 77006. 我们可以去查看当地的房产清单, 并且可以了解到现在的市场价, 但是我们却得不到历史信息. 但是我们可以在 Quandl 得到这方面的信息. 我们可以查寻 "home value index 77006". 我们可以得到一系列的结果, 有高, 中, 低档, 还有三室的等等. 加入我们想要一个三居室的房子. 我们选中一个, 然后点进去看一下. 事实上, Quandl 已经提供了图表数据, 但是出于学习的目的, 我们还是获取其数据集, 自己制作图表, 以及其他的一些数据分析. 选择 CSV 格式并下载. Pandas 支持 csv, excel, hdf, sql, json, msgpack, html, gbg, stata, clipboard, pickle data 等格式的输入输出. 把下载好的 csv 文件放在与你在操作的 python 脚本文件的文件夹里.
下面开始处理这个 csv 文件, 首先是导入并转成 dataframe:
import pandas as pd
df = pd.read_csv('ZILL-Z77006_3B.csv')
print(df.head())
输出:
Date Value
0 2018-11-30 48.3
1 2018-10-31 48.1
2 2018-09-30 48.3
3 2018-08-31 49.4
4 2018-07-31 49.2
通过这个输出, 我们发现, 我们需要设置一个合适的索引:
df.set_index('Date', inplace = True)
输出:
Value
Date
2018-11-30 48.3
2018-10-31 48.1
2018-09-30 48.3
2018-08-31 49.4
2018-07-31 49.2
现在, 我们又想把这个 dataframe 输出成 csv 文件呢?
df.to_csv('newCsv.csv')
好了, 现在查看一下你的项目文件夹, 看看是否多了一个 newCsv.csv 文件? 理论上, 应该是有的. 可以打开看一下这个文件, 大概长这个样子:
目前我们这个例子是只有一个 value 列, 但是如果你的数据里有很多的列, 然而, 你只想将其中的某一列输出到 csv 文件, 可以这样做:
df['Value'].to_csv('newCsv2.csv')
生成的 csv 文件大概长这样:
由于在之前我们把 "Date" 设置成了索引列, 所以日期列作为索引列也一并输出了, 但是与之前去别的是没有表头了. 这里大家可以自己尝试一下, 不要"Date"列做索引, 那么就不会输出日期这一列, 但是同样会输出一列自增数字.
下面, 我们再来读入第一个生成的 csv 文件:
df = pd.read_csv('newCsv.csv')
print(df.head())
输出:
Date Value
0 2018-11-30 48.3
1 2018-10-31 48.1
2 2018-09-30 48.3
3 2018-08-31 49.4
4 2018-07-31 49.2
见鬼, 我们定义的索引又没有了. 这是因为 CSV 文件并没有"索引"属性. 为了解决这个问题, 我们可以在读取的时候同时设置索引, 而不是读取之后再设置索引:
df = pd.read_csv('newCsv.csv', index_col=0)
print(df.head())
Output:
Value
Date
2015-06-30 502300
2015-05-31 501500
2015-04-30 500100
2015-03-31 495800
2015-02-28 492700
这里 index_col = 0 的意思就是把第0列设置为索引列.
还有一个问题, 就是 "Value" 这个列名其实是没有什么实际意义的, 我们需要给它一个具有实际意义的名字, 有很多方法可以更改列名, 下面介绍其中一种:
df.columns = ['Austin_HPI']
print(df.head())
输出:
Austin_HPI
Date
2018-11-30 48.3
2018-10-31 48.1
2018-09-30 48.3
2018-08-31 49.4
2018-07-31 49.2
接下来, 我们再把这个 dataframe 保存成一个新的 csv 文件:
df.to_csv('newcsv3.csv')
打开文件看下, 大概长这样:
我们看到新生成文件带上了表头, 那么如果你不想要这个表头, 要怎么做呢?
df.to_csv('newcsv4.csv', header=False)
这样保存的 newcsv4.csv 文件就没有表头了, 那么当我们再想读入这个文件的时候, 自然就也是没有表头的了, 那么要怎么在读取文件的同时加上表头呢? 可以这样操作:
df = pd.read_csv('newcsv4.csv', names = ['Date','House_Price'], index_col=0)
print(df.head())
输出:
Austin_HPI
Date
2018-11-30 48.3
2018-10-31 48.1
2018-09-30 48.3
2018-08-31 49.4
2018-07-31 49.2
以上就是一些基本的输入/输出操作.
正如我们前面所说的, Pandas 支持各种格式的输入/输出. 下面我们来尝试一下以 html 的格式输出 df 文件:
df.to_html('example.html')
这其实就是 html 的表格, 大家可以查看源码看一下. 生成的 example.html 大概长这样:
有一点要注意的是: 这个表格被自动赋予了 "dataframe" 类, 也就是说你还可以对其自定义其他 CSS 样式.
当我需要 SQL 输出的时候, 我特别喜欢使用 Pandas. 我会把数据库里的所有数据都转成 dataframe 格式, 然后做需要的计算, 再以我想要的格式输出.
最后, 介绍一下如果你想改变某一列的列名, 该怎么做呢:
df = pd.read_csv('newcsv4.csv', names=['Date', 'Austin_HPI'])
print(df.head())
df.rename(columns={'Austin_HPI': '77006_HPI'}, inplace=True)
print(df.head())
输出:
Date Austin_HPI
0 2018-11-30 48.3
1 2018-10-31 48.1
2 2018-09-30 48.3
3 2018-08-31 49.4
4 2018-07-31 49.2
Date 77006_HPI
0 2018-11-30 48.3
1 2018-10-31 48.1
2 2018-09-30 48.3
3 2018-08-31 49.4
4 2018-07-31 49.2
这里呢, 我们首先读入文件, 并且分别给字段命名为 "Date" 和 "Austin_HPI". 然后, 我们决定不叫 "Austin_HPI", 而要改为 "77006_HPI". 所以, 我们使用 df.rename() 函数, 指定我们我想改变的列的名字. 记住这里别忘了加上 "inplace=True" 来确保对原对象做了更改, 而不是生成一个新对象.
后面会持续更新, 有任何问题或者错误, 欢迎留言, 希望和大家交流学习.
基于 Python 和 Pandas 的数据分析(3) --- 输入/输出 基础的更多相关文章
- 基于 Python 和 Pandas 的数据分析(1)
基于 Python 和 Pandas 的数据分析(1) Pandas 是 Python 的一个模块(module), 我们将用 Python 完成接下来的数据分析的学习. Pandas 模块是一个高性 ...
- 基于 Python 和 Pandas 的数据分析(4) --- 建立数据集
这一节我想对使用 Python 和 Pandas 的数据分析做一些扩展. 假设我们是亿万富翁, 我们会想要多元化地进行投资, 比如股票, 分红, 金融市场等, 那么现在我们要聚焦房地产市场, 做一些这 ...
- 基于 Python 和 Pandas 的数据分析(2) --- Pandas 基础
在这个用 Python 和 Pandas 实现数据分析的教程中, 我们将明确一些 Pandas 基础知识. 加载到 Pandas Dataframe 的数据形式可以很多, 但是通常需要能形成行和列的数 ...
- 基于 Python 和 Pandas 的数据分析(7) --- Pickling
上一节我们介绍了几种合并数据的方法. 这一节, 我们将重新开始不动产的例子. 在第四节中我们写了如下代码: import Quandl import pandas as pd fiddy_states ...
- 基于 Python 和 Pandas 的数据分析(6) --- Joining and Merging
这一节我们将看一下如何通过 join 和 merge 来合并 dataframe. import pandas as pd df1 = pd.DataFrame({'HPI':[80,85,88,85 ...
- 基于 Python 和 Pandas 的数据分析(5) --- Concatenating and Appending
这一节我们将会介绍几种不同的合并数据的方法. 在我们这个不动产投资的例子中, 我们希望获取 51 个州的房产数据, 并把它们组合起来. 我们这样做有很多原因. 这样做既便于我们做分析, 同时也可以占用 ...
- 万字长文,Python数据分析实战,使用Pandas进行数据分析
文章目录 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家 ...
- python requests抓取NBA球员数据,pandas进行数据分析,echarts进行可视化 (前言)
python requests抓取NBA球员数据,pandas进行数据分析,echarts进行可视化 (前言) 感觉要总结总结了,希望这次能写个系列文章分享分享心得,和大神们交流交流,提升提升. 因为 ...
- 基于Python的数据分析(1):配置安装环境
数据分析是一个历史久远的东西,但是直到近代微型计算机的普及,数据分析的价值才得到大家的重视.到了今天,数据分析已经成为企业生产运维的一个核心组成部分. 据我自己做数据分析的经验来看,目前数据分析按照使 ...
随机推荐
- git log的常见用法
git log 使用git log命令,什么参数都没有的话,会以下面的格式输出所有的日志(我当前的git仓库只有三个提交).如果日志特别多的话,在git bash中,按向下键来查看更多,按q键退出查看 ...
- Mysql高级第一天(laojia)
select char_length('我们love'); select *, char_length(sname) '姓名字数' from tbl_student; select '对方' + '5 ...
- 【react】兄弟组件的通信方式,传统非redux
很多用过redux开发的朋友们都知道,一般兄弟组件通信可以使用redux. redux也是近期在挤时间学习中.可能也不是很懂,说不定是有错误的理解,若有.现在虽然自己搭建了一个react+router ...
- 线程池demo
package test; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callabl ...
- prufer编码 cayley定理
背景(在codeforces 917D 报废后,看题解时听闻了这两个玩意儿.实际上917D与之“木有关西”,也可以认为是利用了prufer的一些思路.) 一棵标号树的Pufer编码规则如下:找到标号最 ...
- Tomcat 7服务器线程模型
Tomcat 7服务器网络处理主要由NioEndpoint,其处理客户端连接的主要流程如图所示图中Acceptor及Worker分别是以线程池形式存在,Poller是一个单线程.注意,与BIO的实现一 ...
- windows2012R2标准版升级到数据中心版,不用重装系统
windows2012R2标准版升级到数据中心版,不用重装系统 Windows Server 2012 R2是微软的服务器系统,是 Windows Server 2012 的升级版本. Windows ...
- 问题:grid卸载后重新安装时ASM磁盘识别不到了
现象,磁盘路径是对的,但是识别不出来asmdisk2 系统显示磁盘也存在 识别不到的原因是:安装了一次磁盘已经有asm信息写入,需要擦除才能重新被识别到,命令如下 [root@swnode1 dev] ...
- 基础_cifar10_model
今天进一步在cifar10数据集上解决几个问题: 1.比较一下序贯和model,为什么要分成两块: 2.同样的条件下,我去比较一下序贯和model.这个例子作为今天的晚间运行. 1.比较一下序贯和mo ...
- Bootstrap3基础 form-horizontal 表单元素横向布局 简单示例
内容 参数 OS Windows 10 x64 browser Firefox 65.0.2 framework Bootstrap 3.3.7 editor ...