从数据中提取价值!
概述
在上一篇文章中,我们学习了如何从DataFrame或Series中选择相关数据。从我们的数据表示中选择正确的数据对于完成工作非常重要,正如我们在练习中所演示的那样。
然而,数据并不总是以我们想要的格式直接从内存中出来。有时我们需要做一些额外的工作来重新格式化数据以适应当前的任务。本篇将介绍我们可以应用于数据的不同操作,以使输入数据“恰到好处”。
咱们还是使用上篇文章中的《葡萄酒杂志》的数据进行演示,大家可以去我上一篇文章中的头部下载。
政安晨:快速学会~机器学习的Pandas数据技能(三)(重命名与合并)https://blog.csdn.net/snowdenkeke/article/details/136081348
import pandas as pd
pd.set_option('display.max_rows', 5)
import numpy as np
reviews = pd.read_csv("./winemag-data-130k-v2.csv", index_col=0)
reviews
汇总函数
Pandas提供了许多简单的“汇总函数”(非官方名称),可以以某种有用的方式对数据进行重组。例如,考虑describe()方法:
该方法生成给定列属性的高级摘要。它是类型感知的,意味着其输出根据输入的数据类型而改变。上面的输出仅对数值数据有意义;对于字符串数据,我们得到以下结果:
如果您想要获取DataFrame或Series中某一列的特定简单汇总统计信息,通常有一个方便的pandas函数可以实现。
例如,要查看分配的点数的平均值(如一款平均评分的葡萄酒的表现如何),可以使用mean()函数:
reviews.points.mean()
要查看独特值的列表,我们可以使用unique()函数:
reviews.taster_name.unique()
要查看数据集中的唯一值列表以及它们出现的频率,我们可以使用value_counts()方法:
reviews.taster_name.value_counts()
映射
地图是从数学中借用的一个术语,表示将一个值集合“映射”到另一个值集合的函数。在数据科学中,我们经常需要从现有数据创建新的表示形式,或者将数据从现在的格式转换为我们希望的格式。地图是处理这项工作的方法,因此它们对于完成工作非常重要!
有两种常用的映射方法。
map()是第一个,也稍微简单一些。例如,假设我们想要将葡萄酒得分重新平均到0。我们可以按照以下方式实现:
review_points_mean = reviews.points.mean()
reviews.points.map(lambda p: p - review_points_mean)
传递给map()的函数应该期望从Series中接收一个单值(在上面的例子中是一个点值),并返回该值的转换版本。map()返回一个新的Series,其中所有的值都被你的函数转换过。
如果我们想通过调用每一行的自定义方法来转换整个DataFrame,则可以使用apply()方法来实现相同的功能。
def remean_points(row):row.points = row.points - review_points_meanreturn rowreviews.apply(remean_points, axis='columns')
如果我们在调用reviews.apply()的时候指定axis='index',那么我们需要传递一个函数来转换每一行,而不是每一列。
需要注意的是,map()和apply()分别返回新的转换后的Series和DataFrame,它们不会修改原始数据。如果我们查看reviews的第一行,可以发现它仍然保持着原始的points值。
reviews.head(1)
Pandas提供了许多常见的映射操作作为内置功能。例如,下面是重新计算我们的points列的更快方法:
review_points_mean = reviews.points.mean()
reviews.points - review_points_mean
在这段代码中,我们在左边(Series中的所有值)和右边(平均值)之间执行了一个操作。Pandas会分析这个表达式,并确定我们的意图是将每个值减去平均值。
如果我们在长度相等的Series之间执行这些操作,Pandas也会理解该如何处理。例如,将数据集中的国家和地区信息组合在一起的简单方法是执行以下操作:
reviews.country + " - " + reviews.region_1
这些运算符比map()或apply()更快,因为它们利用了内建在pandas中的加速方式。所有标准的Python运算符(>、<、==等)都可以以这种方式工作。
然而,它们不像map()或apply()那样灵活,map()或apply()可以做更高级的操作,比如应用条件逻辑,而仅仅使用加法和减法是无法做到这一点的。