Python Pandas – 计算索引器并在没有精确匹配时找到下一个索引值
简介
Pandas是一种流行的Python数据分析库,提供了强大的工具来处理和操作大型结构化数据集。Pandas中的Series和DataFrame对象允许您使用索引器来快速访问数据。本篇文章中,我们将探索如何使用索引器计算并找到没有精确匹配时下一个索引值。
计算索引器
在Pandas中,索引器是数据对象中的一组标签。索引器可以是整数,字符串或将值映射到唯一标签的字典。例如,下面的代码创建了一个包含不同种类水果重量的Pandas Series:
import pandas as pd
fruits = pd.Series([10, 5, 2, 1], index=['apple', 'orange', 'banana', 'peach'])
在上面的代码中,我们创建了一个名为fruits的Series对象。该Series中包含四种不同种类水果的重量信息,并使用字符串索引器apple、orange、banana和peach分别标记了这些数据点。
我们可以使用索引器访问这个Series:
print(fruits['apple']) # 输出 10
在上述代码中,我们使用字符串索引器“apple”访问了fruits Series中对应的重量10。如果我们有一个包含许多数据点的数据集,那么手动的计算每一个数据点的索引器是不切实际的。因此,我们需要使用更先进的工具来计算索引器。
Pandas计算索引器
在Pandas中,我们可以使用idxmin()、idxmax()和argmin()、argmax()函数来寻找索引器。这些函数返回Series或DataFrame中包含最小值、最大值、最小值索引、最大值索引的标签。
例如,下面的代码演示了如何在包含4种水果重量信息的fruits Series中找到最小值和最小值的索引器:
print(fruits.idxmin()) # 输出 peach
print(fruits.argmin()) # 输出 3
在这里,我们使用idxmin()函数找到最小值的索引器“peach”,使用argmin()函数找到最小值重量的位置3。同样,我们也可以使用idxmax()和argmax()函数查找最大值和最大值的索引器。
但是, 如果fruits Series中没有包含精确匹配当前查询索引器的标签,如何找到接下来的标签呢?我们可以使用shift()函数来移动Series中的数据来找到接下来的标签。
如下代码演示了如何使用shift()函数来计算接下来的索引器:
print(fruits.shift(1)) # 输出apple NaN
# orange 10.0
# banana 5.0
# peach 2.0
在上述代码中,我们使用shift()函数将fruits Series中的数据向上移动1个位置。因为第一行没有内容,所以第一个元素的“previous”索引器是NaN,即不适用。第二个元素的索引器为“apple”,前一个元素的“next”索引器为“orange”,以此类推。如果我们再次查询Series中的索引器,依次为“peach”、“banana”和“orange”,复杂程度就会增加。因此,我们可以使用concat()函数将shift()的结果附加到原始Series对象后面,从而获得完整的Series:
import numpy as np
print(pd.concat([fruits, fruits.shift(1)], axis=1, keys=['fruit', 'previous']))
# fruit previous
# apple 10 NaN
# orange 5 10.0
# banana 2 5
在上述代码中,我们使用了concat()函数将两个Series对象(原始fruits Series和使用shift()函数返回的构造对象)水平连接起来,再命名为fruits和previous。当我们再次查询fruits Series对象时,依次为“peach”、“banana”、“orange”和“apple”。
现在我们有了一个完整的Series对象,包含所有的索引器,接下来就需要找到下一个索引器。在本例中,我们需要找到当前索引器的下一项(虽然这并不总是完全正确的解决方案)。 我们可以使用loc[]函数,该函数允许使用包含一个或多个值的列表或数组访问数据:
print(fruits.loc[[fruits.idxmin(), 'banana']]) # 输出 peach 1
# banana 2ISBN 6
在上述代码中,我们使用loc[]函数和列表[fuits.idxmin(),'banana'],访问了fruits Series中“peach”和“banana”的重量数据。因为这些列表与fruits Series的索引标签匹配,所以我们可以看到这些数据点的重量信息。
现在,我们需要找到当前索引器的下一项。 我们可以使用index.get_loc()函数,该函数返回当前索引器的位置,然后添加1作为下一位置并在Series中使用index[]选项来返回下一个索引器:
print(fruits.index[fruits.index.get_loc('peach') + 1]) # 输出 banana
在上述代码中,我们使用index.get_loc()函数找到了当前索引器“peach”对应的位置,然后在同一位置上添加了1,找到了下一个位置上的索引器“banana”。
这就是在没有精确匹配集合中的索引器时,如何计算下一个索引器。下面是完整的代码示例:
import pandas as pd
# 创建fruits Series
fruits = pd.Series([10, 5, 2, 1], index=['apple', 'orange', 'banana', 'peach'])
# 找到最小值和最小值索引器
print(fruits.idxmin()) # 输出 peach
print(fruits.argmin()) # 输出 3
# 计算下一个索引器
print(pd.concat([fruits, fruits.shift(1)], axis=1, keys=['fruit', 'previous']))
print(fruits.loc[[fruits.idxmin(), 'banana']]) # 输出 peach 1
# banana 2
print(fruits.index[fruits.index.get_loc('peach') + 1]) # 输出 banana
结论
在本文中,我们介绍了Pandas中索引器及其计算的概念。我们使用idxmin()和argmin()函数找到Series中最小值和最小值的索引器,然后使用shift()、concat()和loc[]函数计算不在Series中的下一个索引器。这些技术可以帮助您更有效地处理和操作大型结构化数据集。
极客笔记