我刚刚开始学习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吗?
答案 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
),但是找到了整数(用于按位置选择)。