和index有关的pandas切片问题

我们使用pandas常常会涉及到切片操作,特别是一维的Series,我常常觉得它和Python list无甚区别,所以经常就用list的切片方法去切片Series。

然而结果呢?有时候会成功,有时候就会报恼人的KeyError。次数多了之后,我发现这样一个问题:

当Series或者DataFrame的index为int类型时,你对它进行切片,切片的数字或者区段,pandas会自动理解为index,即它会认为你在用index进行切片。此时如果你Series的index和正常的从0开始的有序整数不一样的话,自然会报错;然而若你的index非int数据类型,比如说是str字符串,那么你采取切片就和list一样了,即一个名为“ser”的Series,ser[0]就代表着第一个值,和index无关;此外,如果你使用str类型的index去取,照样也可以取出。

所以,综上,当你的Series或DataFrame的index的数据类型是int类型时,你就无法用list切片的方式进行切片或者取单个数值,此时你只能按照index取;如果你的Series或DataFrame的index的数据类型不是int类型,那么你可以用index取,也可以用list切片的方式取

下面上简单的code:

# index不是int类型时(此时为str类型):
dfdf = pd.Series({'1':1,'2':2,'3':3,'4':4})
dfdf
>>> 1    1
    2    2
    3    3
    4    4
    dtype: int64

dfdf[0]
>>> 1

dfdf[-1]
>>> 4

dfdf['1']
>>> 1
# 用list的取数方法或者用str类型的index取都可以
# 当index是int类型时:
# 用astype方法先把index类型转换一下:
dfdf.index = dfdf.index.astype(int)
dfdf.index
>>> Int64Index([1, 2, 3, 4], dtype='int64')

dfdf[0]
>>> KeyError: 0     # 此处省略一万字...

dfdf[-1]
>>> KeyError: -1    # 此处省略一万字...

dfdf[1]
>>> 1

有时候我们要用pandas库处理从数据库中取出来的数据,此时取出来的数据的主键往往会被大家设置成DataFrame的index。而主键往往又都是int类型,所以当你做过drop()/rank()/sort_values()的操作后,原int类型的index必然会乱掉,此时你想取前x条数据,然后又想用df[i]拿到排在第i位的数值的时候,等待你的必然是凉凉。

所以,我们可以在一开始就把index转换为str类型

猜你喜欢

转载自blog.csdn.net/weixin_41712499/article/details/85248664
今日推荐