Python Pandas – 计算当前索引给出新索引的索引器和掩码
在 Pandas 中,我们可以使用 loc
或 iloc
来进行索引。但有时候我们需要根据当前索引计算出新的索引,并进行相应的操作。那该怎么做呢?
我们可以使用 get_loc()
和 Indexer
对象来计算新索引,并使用 isin()
来创建掩码。下面通过一个示例来演示。
假设我们有以下数据集:
import pandas as pd
df = pd.DataFrame({
'name': ['John', 'Mary', 'Peter', 'Maggie'],
'age': [24, 18, 32, 29],
'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen'],
'salary': [5000, 7000, 4000, 6000]
})
df.index = ['A', 'B', 'C', 'D']
这个数据集包含了四个人的名字、年龄、城市和薪资,我们将它们的索引设置为了字母 A-D。
现在我们想根据这个数据集中的城市信息来筛选出一部分数据,具体来说,我们想找出居住在北京和深圳的人的信息。我们可以使用以下代码来实现:
cities = ['Beijing', 'Shenzhen']
mask = df['city'].isin(cities)
result = df.loc[mask]
这里的 isin()
方法返回了一个布尔型的掩码,它表示了哪些行的城市信息等于我们想要的城市列表。我们将这个掩码传递给了 loc
方法,loc
方法会根据掩码来筛选出相应的行。
现在假设我们想使用姓名作为索引,那么我们需要计算出新的索引。我们可以使用 get_loc()
方法来获取当前索引对应的位置,如果我们想以姓名作为新的索引,就需要将姓名转换为对应的位置。
以下是我们可以使用的代码:
new_index = df['name'].apply(lambda x: df.index[df['name'] == x].tolist()[0])
result.index = new_index[mask]
在上面的代码中,我们使用了 apply()
方法遍历了数据集中所有的姓名,然后使用 get_loc()
方法将姓名转换为对应的位置。最后,我们使用 tolist()
和 [0]
将位置转换为具体的值,并将新索引赋值给了 result
对象。
现在我们打印 result
,它会输出以下内容:
name age city salary
0 John 24 Beijing 5000
3 Maggie 29 Shenzhen 6000
可以看到,我们成功地根据城市信息筛选出了相应的行,并将姓名作为了新的索引。
接下来,我们将新索引作为一个 Indexer
对象,它会将当前索引和新索引的映射关系保存下来:
idx = pd.Index(new_index)
new_idx = pd.Indexer.from_arrays([df.index.values, idx.values])
现在,我们可以使用 iloc
和 new_idx
来访问相应的行了:
print(df.iloc[new_idx[0,:]])
这里的 new_idx[0,:]
表示了新索引对应的行的范围,也就是说,它会返回所有用新索引表示的行的位置。与 loc
不同,iloc
使用的是具体的位置而非标签。
输出结果为:
name age city salary
0 John 24 Beijing 5000
3 Maggie 29 Shenzhen 6000
更多Pandas相关文章,请阅读:Pandas 教程
结论
在 Pandas 中,我们可以使用 get_loc()
方法和 Indexer
对象来根据当前索引计算新索引,并使用掩码来进行筛选。同时,在将新索引作为一个 Indexer
对象后,我们可以使用 iloc
方法来访问相应的数据行。
以上就是 Python Pandas 中计算当前索引给出新索引的索引器和掩码的方法。希望对你有所帮助!