Pandas教程-Pandas排序方法
Pandas排序方法是学习和实践使用Python进行数据分析基础的最主要途径之一。数据分析通常使用Pandas、SQL和电子表格进行。Pandas可以处理大量数据,并提供高性能数据操作的能力。
在本教程中,我们将解释如何使用.sort_values()和.sort_index(),这使用户能够在DataFrame中高效地对数据进行排序。
简介
DataFrame是具有带有标签的轴的数据结构,适用于行和列。用户可以按行或列值以及行或列索引对DataFrame进行排序。
行和列都具有数据在用户数据框中的数值表示,称为索引。因此,用户可以通过DataFrame的索引位置从特定的行或列检索数据。索引编号默认从零开始,但用户可以手动分配索引。
准备数据集
在本教程中,我们将使用由美国环境保护署(EPA)编制的关于1984年至2021年间制造的车辆的燃油经济数据集。环境保护署的数据集非常适合理解排序,因为它包含了从数值到文本数据类型的许多不同类型的信息,用户可以根据这些信息进行排序。该数据集总共包含83列。
在开始分析和排序数据集之前,用户需要安装Pandas库。Pandas库的版本应为1.2.0,Python的版本应在3.7.1以上。
为了分析的目的,用户将查看车辆的每加仑英里数(MPG)数据,按照车型、年份、制造商和其他属性进行分类。用户将能够指定要包含在其DataFrame中的列。在本文中,我们只需要可访问的列的子集。
在以下示例中,我们已经传递了读取燃油经济数据集的重要列命令到DataFrame,并显示了新DataFrame的前五行。
例如:
import pandas as pd
column_subset = [
"id",
"make",
"model",
"year",
"cylinders",
"fuelType",
"trany",
"mpgData",
"city08",
"highway08"
]
df = pd.read_csv(
"https://www.fueleconomy.gov/feg/epadata/vehicles.csv",
usecols = column_subset,
nrows = 100
)
df.head()
输出:
用户可以通过调用.read_csv()函数将数据集加载到DataFrame中。我们已经缩小了用于更快输出和低内存使用的列结果。为了进一步限制内存消耗并快速预览数据,用户还可以通过使用'nrows'命令指定要加载的行数。
sort_values()函数
用户可以使用sort_values()函数在DataFrame的行或列上对值进行排序。如果他们想要根据一个或多个列的值对DataFrame的行进行排序:
上图是根据highway08列的值使用sort_values()函数对DataFrame的行进行排序的结果。这是使用列在电子表格中排序数据的示例。
sort_index()函数
用户还可以使用sort_index()函数按照其行索引或列标签对DataFrame进行排序。
sort_values()和sort_index()之间的区别在于sort_values()根据其行或列的值对DataFrame进行排序,而在.sort_index()中,我们根据其索引或列标签对DataFrame进行排序:
DataFrame的索引不被视为列,并且可能只有一个原始索引。DataFrame的行索引可以视为行号,通常从零开始。
按单个列对DataFrame进行排序
为了根据单个列的值对DataFrame进行排序,我们将使用sort_values()。默认情况下,它将返回按升序排序的新DataFrame,但它不会更改主DataFrame。
按升序排序列
要使用.sort_values(),我们将一个包含要按其排序的列名称的单个参数传递给方法。在下一个示例中,我们将按照city08列对DataFrame进行排序。这表示仅燃油汽车的城市每加仑英里数。
例如:
df.sort_values("city08")
输出:
默认情况下,这将按照标记为'city08'的列的值以升序排序DataFrame。但是,我们没有为我们传递给.sort_values()的参数指定名称,实际上我们使用了by参数,这将在下一个示例中解释。
更改排序顺序
默认情况下,sort_values()按升序对DataFrame进行排序,但是如果我们希望按降序对DataFrame进行排序,可以将False值传递给参数。
例如:
df.sort_values(
... by = "city08",
... ascending = False
... )
输出:
我们通过将False值传递给ascending,反转了排序顺序。现在,我们按照在城市条件下测得的每加仑英里的平均值按降序对DataFrame进行了排序。在上面的输出中,DataFrame中的车辆根据其MPG值的高低按行排序。
选择排序算法
Pandas允许用户在.sort_values()和.sort_index()中选择不同的排序算法。以下是可用的排序算法:
- heapsort
- mergesort
- quicksort
默认情况下,在单列上排序时使用quicksort算法。要更改为稳定排序算法,可以使用mergesort算法。我们可以通过在sort_values()或sort_index()中使用kind参数来实现这一点。我们还可以使用heapsort算法来对数据进行排序,但是由于heapsort是最慢的排序算法并且不稳定,因此仅推荐用于最坏情况。
例如:
df.sort_values(
by = "city08",
ascending = False,
kind = "mergesort")
输出:
通过使用kind参数,我们将mergesort算法设置为排序算法。默认情况下,上述输出使用了quicksort算法。我们可以注意到两种算法的输出是不同的,因为quicksort算法不是稳定的排序算法。
请始终记住,在pandas中,当我们对多个列标签进行排序时,我们会忽略kind参数。
当我们对具有相同键的多个记录进行排序时,稳定的排序算法可以在排序后保持这些记录的原始顺序。之所以必须使用稳定的排序算法是因为我们正在执行多次排序。
在多个列上对DataFrame进行排序
在数据分析期间,有时我们希望根据多个列的值对数据进行排序。假设我们有一个包含人名的数据集,我们想要按照人的名字然后是姓氏对其进行排序。这样,具有相同名字的人可以根据他们的姓氏按字母顺序排列。
在以下示例中,我们将对名为city08的单个列的DataFrame进行排序。城市条件下的MPG是可以确定汽车吸引力的重要因素。假设我们还想查看MPG在城市条件下以外的MPG。为了按两个键对DataFrame进行排序,我们可以通过参数传递一个列标签列表。
例如:
df.sort_values(
... by = ["city08", "highway08"]
... )[["city08", "highway08"]]
输出:
在这里,通过指定列标签city08和highway08的列表,我们使用sort_values()对两列进行了排序。
在下一个示例中,我们将解释如何指定排序顺序以及为什么用户需要注意使用的列标签列表。
按升序排序多个列
为了对DataFrame按多个列的值进行排序,我们必须提供列标签的列表。假设,为了按制造商和型号对DataFrame进行排序,我们应该创建以下列表,然后将其传递给sort_values()。
例如:
df.sort_values(
by = ["make", "model"]
)[["make", "model"]]
输出:
现在,我们的DataFrame按制造商列的升序排序。如果存在两个或更多相同的制造商,则DataFrame将按型号列排序。DataFrame将根据我们在列表中指定的列标签的顺序进行排序。
更改列排序顺序
由于我们正在使用多个列对DataFrame进行排序,因此我们还可以指定我们希望列按照哪个顺序进行排序。如果我们想要更改上一个示例中DataFrame的排序顺序,那么我们可以更改传递给by参数的列表中列标签的顺序。
例如:
df.sort_values(
by = ["model", "make"]
)[["make", "model"]]
输出:
在这里,现在我们的DataFrame按照型号列的升序排序,如果存在两个或更多相同的型号,则DataFrame将按制造商列进行排序。我们可以注意到,当我们更改列的顺序时,排序值的顺序也会更改。
按降序排序多个列
到目前为止,我们已经按升序对多列进行了排序。在下一个示例中,我们将按降序对多列进行排序。为了按降序对DataFrame进行排序,我们将ascending值设置为False。
例如:
df.sort_values(
by = ["make", "model"],
ascending = False
输出:
在这里,我们可以注意到,在DataFrame中,制造商列按照反向字母顺序进行了排序,而具有相同make的车辆的型号列的值按降序排列。对于文本数据,排序是一个敏感的问题,这意味着大写文本将在升序中首先出现,在降序中最后出现。
使用不同排序顺序按多个列排序
在Python的Pandas中,我们可以通过在单个函数调用中使用多个列对其进行排序,并使用不同的ascending参数对这些列进行排序。如果用户希望按升序对列进行排序,并对某些列按降序进行排序,那么他们必须将布尔值列表传递给ascending。
在下一个示例中,我们将按make、model和city08列对DataFrame进行排序,前两列应按升序排序,而city08列应按降序排序。为了做到这一点,我们将通过参数传递列标签的列表,以及传递给ascending的布尔值列表。
例如:
df.sort_values(
... by = ["make", "model", "city08"],
... ascending = [True, True, False]
... )[["make", "model", "city08"]]
输出:
在这里,现在我们的DataFrame按制造商和型号列升序排序,而city08列按降序排序。这有助于按照分类顺序对汽车分组,这显示了城市条件下最高的每加仑英里的汽车。
对DataFrame的索引进行排序
在开始讨论如何在索引上进行排序之前,让我们了解索引代表什么。DataFrame具有.index属性,默认情况下是行的位置的数值表示。索引就像行号一样。索引有助于快速查找和识别行。
按升序对索引进行排序
我们可以使用sort_index()函数根据其行索引对DataFrame进行排序。与我们在先前的示例中使用sort_values()函数对列值进行排序一样,像我们使用sort_index()函数对行进行排序时,DataFrame的行变得无序。当用户筛选DataFrame或添加/删除行时,这也可能发生。
为了演示.sort_index()的使用,让我们首先通过使用.sort_values()函数创建一个新的排序DataFrame。
例如:
sorted_df = df.sort_values(by = ["make", "model"])
sorted_df
输出:
在这里,我们已经创建了通过使用多个值进行排序的DataFrame。我们还可以注意到索引行的顺序不是按任何特定顺序排列的。为了使我们的新DataFrame恢复到原始顺序,我们可以使用sort_index()函数。
例如:
sorted_df.sort_index()
输出:
现在,我们DataFrame的索引按升序排序。在sort_index()中,升序排序的默认参数与sort_values()中一样是True。我们可以将其更改为传递false值以按降序排序。在索引上进行排序不会对数据产生任何影响,因为值保持不变。
对于希望使用sort_index()为DataFrame分配自定义索引的用户,这非常有用。假设我们希望使用make和model列为DataFrame设置自定义索引,那么我们必须传递一个列表给set_index()。
例如:
assigned_index_df = df.set_index(
... ["make", "model"]
... )
assigned_index_df
输出:
通过使用此方法,我们可以用制造商和型号列替换默认的基于整数的行索引。这被认为是层次结构索引或多重索引。DataFrame现在由两个轴标签索引,可以使用sort_index()进行排序。
例如:
assigned_index_df.sort_index()
输出:
首先,我们通过使用制造商和型号列为DataFrame分配了一个新的索引,然后我们通过使用.sort_index()函数对索引进行了排序。
按降序对索引进行排序
现在,我们将按DataFrame的索引对其进行降序排序。为了按降序获取输出,我们必须将ascending值设置为False,与我们在.sort_values()中做的一样。
例如:
assigned_index_df.sort_index(ascending = False)
输出:
现在,我们的DataFrame按其索引按降序排序。sort_index()和sort_values()之间的一个区别是sort_index()没有参数,因为它默认按行索引对DataFrame进行排序。
探索高级索引排序概念
在分析数据时,有许多情况发生,用户希望按层次索引对其进行排序。我们已经看到了如何使用make和model列创建MultiIndex。对于此数据集,我们还可以使用id列作为索引。
让我们将id列设置为索引,这对于链接相关数据集将非常有用。例如,EPA的排放数据集还使用id来表示车辆记录的ID。它将排放数据集链接到燃油经济数据集。现在,通过在DataFrame中对两个数据集的索引进行排序,可以加速其他函数的使用,例如merge(),join()和concat()。
对DataFrame的列进行排序
我们还可以使用DataFrame的列标签对行值进行排序。在sort_index()中将可选参数axis设置为1,我们可以对DataFrame的列标签进行排序。与应用于实际数据的排序算法不同,此排序算法应用于轴标签。这对于DataFrame的可视审查非常有用。
如何使用DataFrame轴
当用户在没有传递任何显式参数的情况下使用.sort_index()时,默认使用axis = 0参数。DataFrame的轴既指索引(axis = 0)又指列(axis = 1)。用户可以同时使用两个轴来选择和索引DataFrame中的数据,并且还可以用于对数据进行排序。
使用列标签进行排序
我们还可以使用DataFrame的列标签作为sort_index函数的排序键。
让我们将轴设置为1,以按列名对我们的DataFrame的行值进行排序。
例如:
df.sort_index(axis = 1)
输出:
在这里,我们按升序对DataFrame的列标签进行排序。由于我们的列标签不是数字,而是实际的标签,因此它们是按照字母顺序排列的。请注意,对DataFrame的列进行排序不会更改列的值。
按降序排序列标签
与我们在对行索引进行排序时做的一样,我们还可以按降序对列索引进行排序。要执行此操作,我们将ascending参数的值更改为False。
例如:
df.sort_index(axis = 1, ascending = False)
输出:
总结
在此教程中,我们讨论了Pandas库中的两种主要排序方法:.sort_values()和.sort_index()。我们研究了如何使用这两个方法按升序或降序对DataFrame的行或列进行排序。我们还探讨了如何使用不同的排序算法以及如何在多个列或列标签上对DataFrame进行排序。
使用这两种方法,用户可以根据数据分析的需要按不同的标准对DataFrame进行排序。DataFrame的排序对于理解和探索数据非常重要,因此熟练使用这些方法是进行数据分析的关键一步。