Python数据分析——Pandas 教程(上)
上节,我们讲了 Pandas 基本的数据加载与检索,这节我们讲讲如何进行数据比较。
Pandas系列对象
在 Pandas 中我们获取指定列的数据有多种方式:
- reviews.iloc[:, 1]:获取第二列的数据
- reviews.loc[:, "score_phrase"]:获取指定标签列的数据
- reviews["score_phrase"]:只需要指定列名
![8b8a2c369af04374bc08acfb0084cf6e.png](https://i-blog.csdnimg.cn/blog_migrate/6ac777f011ac4f2d2e5bcb50c3e486a6.jpeg)
为了更好地理解它是如何工作的,我们先来创建一个序列(Series):
![950541f1d8d6dd49800629988f49ec04.png](https://i-blog.csdnimg.cn/blog_migrate/ee48e8363ca06087e458f5bbe07f3ba0.jpeg)
这个序列可以包含任何类型的数据,或者混合类型。下面我们创建一个 string 类型的数据:
![d1bd7ac641aa7e6eef8029106674dd69.png](https://i-blog.csdnimg.cn/blog_migrate/6ff9351fdff8e8f552397cf8c59f8565.jpeg)
在Pandas中创建DataFrame
我们可以通过多样的 Series 来创建 DataFrame。这里,我们通过上面两个序列创建:
![21d38acbd1af4c87ee9a99d9921583f9.png](https://i-blog.csdnimg.cn/blog_migrate/060b903c2da774d29cd63ffa12e8c959.jpeg)
我们通过多重列表也可以达到同样的效果:
![3ac961a0a982a27fa8bab95608b2a52a.png](https://i-blog.csdnimg.cn/blog_migrate/01e9890124f9701991dfb1275433f11c.jpeg)
也可以设置标签:
![d637d0804855b15bb3394ef06fb67bc7.png](https://i-blog.csdnimg.cn/blog_migrate/f5c36b4f09d0e0e9ff04f4804e8a4731.jpeg)
这样我们就可以通过标签来检索数据了:
![e204e5c3f35a155f1ca0d2656e988025.png](https://i-blog.csdnimg.cn/blog_migrate/95f5c92dd9e7622dbf473814d24893f8.jpeg)
我们跳过 column 关键字,直接指定列名:
![0c9c4b3f3593515b26aeb7e263fd5b9c.png](https://i-blog.csdnimg.cn/blog_migrate/4c951d047881988c7ce8d8eb44042964.jpeg)
Pandas DataFrame方法¶
我们前面提到,DataFrame中每一列都是一个 Series 对象:
使用 head 调用前面几条记录:
![1a00796d9bdafaf4a2814cebb74755ee.png](https://i-blog.csdnimg.cn/blog_migrate/0ad266c6b553dd02cbeb6a30e81973f3.jpeg)
Pandas Series 和 DataFrames 都有其他的方法使计算简单化。例如,我们使用 pandas.Series.mean 方法计算均值:
![b4fb8d94ff6db6baa7c8d29d27149e3f.png](https://i-blog.csdnimg.cn/blog_migrate/55918f80354616a548d89c4b12a66bc7.jpeg)
修改 axis 关键字参数求每一行每一列的 mean 值。axis 默认为 0,并像上面的例子那样,计算每一列的方差 mean。我们也可以设置为 1 来计算每一行的方差。注意,那样的话将只计算每行数值的方差:
![8b2b58154550ada47a387fa3a4a1a905.png](https://i-blog.csdnimg.cn/blog_migrate/6ad235a56c9715c28e950fb5a4cf75e0.jpeg)
这里有一些 Series 和 DataFrames 的方法:
- pandas.DataFrame.corr:找出 DataFrame 所有列之间的相关系数
- pandas.DataFrame.count:统计 DataFrame 每一列非空值的个数
- pandas.DataFrame.max:找出每一列的最大值
- pandas.DataFrame.min:找出每一列的最小值
- pandas.DataFrame.median:找出每一列的中位数
- pandas.DataFrame.std:找出每一列的标准误差
我们通过 corr 方法来看一下每一列 score 的相关系数。例如,这能告诉我们是最近发布游戏评价更高(release_year),还是年度发布游戏得分更高(release_month)。
![ce1585bb5f09d7ba6a55c127ba6aaa84.png](https://i-blog.csdnimg.cn/blog_migrate/da7cf737127497f7e9410e8ee7693e96.jpeg)
可以看到,我们的数值列与 score 的相关系数,意味着发布时间与评分并非线性相关的。
Pandas中的DataFrame Math
我们可以在 Series 和 DataFrame 执行数学操作。例如,将每一个 score 值除以 2,将原来 0~10 的缩小成 0~5:
![8a07da35182825ee03797246f4585911.png](https://i-blog.csdnimg.cn/blog_migrate/cd1eeb4ae8bb7f826efd06e5f3174d02.jpeg)
Pandas中的Boolean Indexing
如前所述,reviews 数据集中 score 列的均值为 7。我们想要获取平均分以上的数据该怎么办呢?可以先做比较,生成布尔值标志比较的结果。例如查看 score 是否大于 7:
![d3e0bc1560b31a0e007fec88220571e2.png](https://i-blog.csdnimg.cn/blog_migrate/24e3b219540b3617bc8a5fff27cb71e7.jpeg)
一旦有了比较值,就能选择 DataFrame 中比较值为 True 的行:
![4fe491a3b1b24188f1c278a9b08ae632.png](https://i-blog.csdnimg.cn/blog_migrate/76ff060eb974e26cd0d982b896d95f24.jpeg)
我们也可使用多个条件来过滤,比如我们想找出在 Xbox One 平台上评分大于 7 分的数据,可以这样做:
- 检查 score 是否大于 7
- 检查 platform 平台是否为 Xbox One
![4f2b96df372197ce3adefdb76ad0e817.png](https://i-blog.csdnimg.cn/blog_migrate/e6a7a6dcf1b15a6865cdf34c971af87f.jpeg)
Pandas Plotting
现在,我们知道怎么过滤数据了。我们还可以创建 plots 来观察 Xbox One 与 PlayStation 4 的分布对比情况,这将有助于我们了解哪款终端更适合游戏。我们使用柱状图(histogram)来展示不同的分数范围,能告诉我们哪款终端有更高的评价。
pandas.DataFrame.plot 方法默认绘制线性图形,我们得通过 kind="hist"关键之来绘制柱状图。
通过以下几个步骤:
- 调用 %matplotlib inline 在 Jupyter Notebook 中建立图形
- 过滤数据,只保留 Xbox One 数据
- 绘制 score 列
![0e47d7a3425a6a8ee054871bc8b2d001.png](https://i-blog.csdnimg.cn/blog_migrate/a8abe9e1284c6a67f182f01ed17cadfa.jpeg)
类似的,我们可以绘制针对 PS4 的图形:
![a88071c5a089352a2edee0f69c52c1fc.png](https://i-blog.csdnimg.cn/blog_migrate/85e2b2a240dfd56630067f5a7d814786.jpeg)
可以看到 PlayStation 4 比 Xbox One 有更高的评分。
查看 Xbox One 中评分大于 7 分的分布情况:
![cb86aef1765a05dcc8c3d12a0ecd1273.png](https://i-blog.csdnimg.cn/blog_migrate/225062b9a45d8b6e74e4fddb7ed2e62a.jpeg)
(完)
#python #pandas