在具有多个数据类型的索引列表上切片Pandas系列对象

时间:2019-06-21 05:36:56

标签: python pandas slice

我刚刚开始学习Pandas,而且当索引列表包含多种类型的对象时,我也不了解切片的工作原理。

import pandas as pd
arr = pd.Series([10, 20, 30, 40], index = [2, 3, 'six', 'eight'])
arr[2:3] #Output -- 30
arr[3:'six'] #TypeError: cannot do slice indexing on <class 'pandas.core.indexes.base.Index'> with these indexers [3] of <class 'int'>
arr['six':'eight'] #Output -- 30, 40

不是arr [2:3]应该是20,不是arr ['six':'eight']应该只是30吗?

1 个答案:

答案 0 :(得分:2)

如果索引中的值类型不同,熊猫的工作效果最佳。

这里工作的通用解决方案是按Index.get_loc获取每个索引的位置,并按Series.iloc选择:

arr = pd.Series([10, 20, 30, 40], index = [2, 3, 'six', 'eight'])

print (arr.iloc[arr.index.get_loc(2):arr.index.get_loc(3)])
2    10
dtype: int64

print (arr.iloc[arr.index.get_loc(3):arr.index.get_loc('six')])
3    20
dtype: int64

print (arr.iloc[arr.index.get_loc('six'):arr.index.get_loc('eight')])
six    30
dtype: int64

您的解决方案部分起作用:

首先,如果同时使用两个整数进行选择,则熊猫将按位置索引(如iloc):

print (arr[2:3])
six    30
dtype: int64

print (arr.iloc[2:3])
six    30
dtype: int64

如果同时选择两个标签,则大熊猫会像标签一样选择(例如loc):

print (arr['six':'eight'])
six      30
eight    40
dtype: int64

print (arr.loc['six':'eight'])
six      30
eight    40
dtype: int64

未实现按混合值进行选择,因此引发了错误-熊猫尝试按标签进行选择(例如使用loc),但是找到了整数(用于按位置选择)。