本节夸克网盘数据集链接:https://pan.quark.cn/s/07400ba46613 提取码:Z9sZ
映射允许我们逐个值地对DataFrame或Series中的数据进行转换,作用于整个列。然而,通常我们希望对数据进行分组,然后针对数据所在的组执行特定操作。
正如您将了解到的,我们可以通过groupby()
操作来实现这一点。我们还将涵盖一些其他主题,比如更复杂的DataFrame索引方式,以及如何对数据进行排序。
到目前为止,我们已经大量使用的一个函数是value_counts()
函数。我们可以通过以下方式复制value_counts()
的功能:
In [1]:
import pandas as pd
reviews = pd.read_csv("../input/wine-reviews/winemag-data-130k-v2.csv", index_col=0)
pd.set_option("display.max_rows", 5)
In [2]:
reviews.groupby('points').points.count()
Out[2]:
points
80 397
81 692
...
99 33
100 19
Name: points, Length: 21, dtype: int64
groupby()
创建了一个将相同的分值分配给给定葡萄酒的评论组。然后,对于每个组,我们获取了points()
列,并计算了它出现的次数。value_counts()
只是这个groupby()
操作的一个快捷方式。
我们可以使用之前用过的任何摘要函数来处理这些数据。例如,要获取每个分值类别中最便宜的葡萄酒,我们可以执行以下操作:
In [3]:
reviews.groupby('points').price.min()
Out[3]:
points
80 5.0
81 5.0
...
99 44.0
100 80.0
Name: price, Length: 21, dtype: float64
您可以将我们生成的每个组视为DataFrame的一个切片,其中仅包含与值匹配的数据。我们可以直接使用apply()
方法访问这个DataFrame,然后可以以任何我们认为合适的方式操作数据。例如,以下是从数据集中每个酿酒厂中评论的第一瓶葡萄酒中选择名称的一种方式:
In [4]:
reviews.groupby('winery').apply(lambda df: df.title.iloc[0])
Out[4]:
winery
1+1=3 1+1=3 NV Rosé Sparkling (Cava)
10 Knots 10 Knots 2010 Viognier (Paso Robles)
...