这一节, 我们要讨论 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" 来确保对原对象做了更改, 而不是生成一个新对象.
后面会持续更新, 有任何问题或者错误, 欢迎留言, 希望和大家交流学习.