第十章 pandas官方文档0.22中文教程—Tutorials(有关cookbook),个人渣翻译

这是一个包涵许多pandas教程的指南,主要面向新用户。
#####内部指南
看10分钟入门pandas*(10 Minutes to pandas)
更复杂的使用方法参看cookbook
这里写图片描述
#####pandas cookbook
这本cookbook的目标是给你一些具体的例子,让你从pandas开始。这些都是真实数据的例子,以及它所包含的所有错误和古怪。
这里是v0.1版本的链接。对于最新的目录,请参阅pandas-cookbook GitHub存储库。要运行本教程中的示例,您需要克隆GitHub存储库并运行IPython Notebook。看看如何使用这本cookbook。
(先去github下载数据,否则下面的章节没办法完成)
这里写图片描述
######快速的浏览一下IPython Notebook
教你一些IPython的简单用法

######chapter 1. 把你的数据由pandas读取听起来是最简单的事情。即使编码是错误的

从csv文件中读取一个数据
您可以使用read_csv函数从CSV文件中读取数据。默认情况下,它假定字段是逗号分隔的。
我们将从蒙特利尔看一些骑自行车的数据。这里是原始页面(在法语中),但它已经包含在这个存储库中。我们使用的是2012年的数据。

import pandas as pd
pd.set_option('display.mpl_style', 'default') # Make the graphs a bit prettier
figsize(15, 5)

个人执行:运行display.mpl_style出错
这里写图片描述

broken_df = pd.read_csv('../data/bikes.csv')
# Look at the first 3 rows
broken_df[:3]

(因为自己的ipython工作路径,和下载的bikes.csv路径不一致,写代码的时候要注意)
个人执行:直接报错,看不了什么前3行
这里写图片描述
你可以看到这完全损坏了。read_csv拥有一堆选项能够让我们修复它,在这里我们:

将列分隔符改成;
将编码改为latin1(默认为utf-8)
解析Date列中的日期
告诉它我们的日期将日放在前面,而不是月
将索引设置为Date

fixed_df = pd.read_csv('../data/bikes.csv', sep=';', encoding='latin1', parse_dates=['Date'], dayfirst=True, index_col='Date')
fixed_df[:3]

这里写图片描述
当你读取 CSV 时,你会得到一种称为DataFrame的对象,它由行和列组成。 从数据框架中获取列的方式与从字典中获取元素的方式相同。
这里有一个例子:

fixed_df['Berri 1']

这里写图片描述
好长一列数据。
绘制一列:
只需把.plot()添加到末尾,是不是很容易?
我们可以看到,不出意料,没有什么人在一月、二月和三月骑自行车。

fixed_df['Berri 1'].plot()

这里写图片描述
我们也可以很容易地画出所有的列。我们会把它变大一点。你可以看到它在一起被压扁了,但是所有的自行车道基本上都是一样的——如果这一天对骑自行车的人来说是糟糕的一天,那么到处都是糟糕的一天。

fixed_df.plot(figsize=(15, 10))

这里写图片描述


######chapter 2 如何从pandas的数据中选择数据还不是很明显。这里,我们将解释基础的(如何获取切片和获取列)

# The usual preamble
import pandas as pd
# Make the graphs a bit prettier, and bigger
pd.set_option('display.mpl_style', 'default') 
pd.set_option('display.line_width', 5000) 
pd.set_option('display.max_columns', 60) 

figsize(15, 5)

(同样的错误No such keys(s): 'display.mpl_style,难道是写法有改变?)
我们将在这里使用一个新的数据集,来演示如何处理更大的数据集。这是来自NYC开放数据的311个服务请求的一个子集。

complaints = pd.read_csv('../data/311-service-requests.csv')

(运行语句有如下提示,看不懂…………)
这里写图片描述
当您查看一个大的dataframe,而不是向您显示dataframe的内容时,它将向您显示一个摘要。这包括所有列,以及每个列中有多少个非空值。
(我的运行结果与原文不太一样啊)
这里写图片描述
这里写图片描述
(11万行,52列,恐怖。)
要选择一个列,我们使用列的名称进行索引,如下所示

complaints['Complaint Type']

要获得dataframe的前5行,我们可以使用切片: df[:5]。
这是了解dataframe中信息的一种很好的方法——花一分钟时间查看一下内容,了解一下这个数据集。

complaints[:5]

这里写图片描述
我们可以组合这些来得到列的前5行

complaints['Complaint Type'][:5]

这里写图片描述
参数前后位置不影响

complaints[:5]['Complaint Type']

选出多个列:
如果我们只是想知道complaints的类型和地区,而不是其他信息呢?pandas使得选择列的子集变得非常容易:只需列出你想要的列的列表。

complaints[['Complaint Type', 'Borough']]

这向我们展示了一个总结,然后我们可以看到前10行

complaints[['Complaint Type', 'Borough']][:10]

最常见的complaint类型是什么?
这是个很容易回答的问题!我们可以使用.value_count()方法

complaints['Complaint Type'].value_counts()

这里写图片描述
如果我们想要最常见的10个complaint,我们可以这样做:

complaint_counts = complaints['Complaint Type'].value_counts()
complaint_counts[:10]

这里写图片描述
但是它变得更好!我们可以把它们画出来。

complaint_counts[:10].plot(kind='bar')

这里写图片描述

######chapter 3 在这里我们开始认真的学习如何切割和以复杂的方式过滤数据。

pd.set_option('display.line_width', 5000) 
pd.set_option('display.max_columns', 60) 

让我们继续我们的NYC 311服务请求示例的数据。

complaints = pd.read_csv('../data/311-service-requests.csv')

选择仅有噪音的投诉
我想知道哪个区有最多的噪音投诉。首先,我们来看看数据,看看它是什么样子。
为了得到噪音投诉,我们需要找到“投诉类型”栏是“噪音-街道/人行道”的行。我会告诉你们怎么做,然后解释发生了什么。

noise_complaints = complaints[complaints['Complaint Type'] == "Noise - Street/Sidewalk"]
noise_complaints[:3]

这里写图片描述
如果你看一下noise_complaints,你会发现这是有效的,而且它只包含有正确投诉类型的投诉。但这是如何运作的呢?让我们把它分解成两部分。

complaints['Complaint Type'] == "Noise - Street/Sidewalk"

这是一大堆的问题和错误,每一行都在我们的dataframe中。当我们用这个数组索引dataframe时,我们得到的是行。
您还可以将多个条件组合成这样的&操作符

is_noise = complaints['Complaint Type'] == "Noise - Street/Sidewalk"
in_brooklyn = complaints['Borough'] == "BROOKLYN"
complaints[is_noise & in_brooklyn][:5]

这里写图片描述
或者我们只需要一些列。

complaints[is_noise & in_brooklyn][['Complaint Type', 'Borough', 'Created Date', 'Descriptor']][:10]

这里写图片描述
关于numpy数组的题外话
在内部,列的类型是pd.series

pd.Series([1,2,3])

pandas series的内部是numpy 数组。如果将.values添加到任何序列的末尾,就会得到它的内部numpy数组。

np.array([1,2,3])
pd.Series([1,2,3]).values

两个的输出都是array([1, 2, 3])

arr = np.array([1,2,3])
arr != 2

输出是:array([ True, False, True], dtype=bool)

arr[arr != 2]

输出是:arr[arr != 2]
回到之前的话题,哪个区最多的噪音投诉?

is_noise = complaints['Complaint Type'] == "Noise - Street/Sidewalk"
noise_complaints = complaints[is_noise]
noise_complaints['Borough'].value_counts()

这里写图片描述
就是曼哈顿!但如果我们想要除以总投诉数,让它更有意义呢?这也很容易。

noise_complaint_counts = noise_complaints['Borough'].value_counts()
complaint_counts = complaints['Borough'].value_counts()
noise_complaint_counts / complaint_counts

(因为用的python3,并没有原文中结果是0)
这里写图片描述
把数据画出来:

(noise_complaint_counts / complaint_counts).plot(kind='bar')

这里写图片描述


版权声明:本文为dark_tone原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>