熊猫系列按索引分设置

时间:2018-02-01 21:08:03

标签: python pandas subset series

以下是我的例子:

import pandas as pd
df = pd.DataFrame({'col_1':[1,5,6,77,9],'col_2':[6,2,4,2,5]})
df.index = [8,9,10,11,12]

此子设置按行顺序排列:

df.col_1[2:5]

返回

10     6
11    77
12     9
Name: col_1, dtype: int64

虽然这个子集已经是索引而且不起作用:

df.col_1[2]

返回:

KeyError: 2

我发现它非常令人困惑,而且很奇怪它背后的原因是什么?

2 个答案:

答案 0 :(得分:1)

您的陈述含糊不清,因此最好明确定义您想要的内容。

df.col_1 [2:5]使用整数位置就像df.col_1.iloc[2:5]一样。

当df.col [2]使用索引标签位置工作时df.col_1.loc[2],因此没有标记为2的索引,因此您得到了KeyError。

因此,最好定义是使用.iloc的整数位置还是使用.loc的索引标签位置。

请参阅Pandas Indexing docs

答案 1 :(得分:1)

我们假设这是最初的DataFrame:

df = pd.DataFrame(
    {
        'col_1':[1, 5, 6, 77, 9], 
        'col_2':[6, 2, 4, 2, 5]
        }, 
    index=list('abcde')
    )

df
Out: 
   col_1  col_2
a      1      6
b      5      2
c      6      4
d     77      2
e      9      5

索引由字符串组成,因此通常很明显您要执行的操作:

  • df['col_1']['b']您传递了一个字符串,因此您可能正在尝试按标签访问。它返回5.
  • df['col_1'][1]您传递了一个整数,因此您可能尝试按位置访问。它返回5.
  • 与切片相同:df['col_1']['b':'d']使用标签,df['col_1'][1:4]使用位置。

当索引也是整数时,没有什么是显而易见的了。

df = pd.DataFrame(
    {
        'col_1':[1, 5, 6, 77, 9], 
        'col_2':[6, 2, 4, 2, 5]
        }, 
    index=[8, 9, 10, 11, 12]
    )

df
Out: 
    col_1  col_2
8       1      6
9       5      2
10      6      4
11     77      2
12      9      5

假设您输入df['col_1'][8]。您是想通过标签还是按位置访问?如果是切片怎么办?没人知道。在这一点上,熊猫根据其用途选择其中一个。它最终是一个系列,系列与阵列的区别在于它的标签,因此df['col_1'][8]的选择是标签。使用标签切片并不常见,因此大熊猫在这里很聪明,并且在传递切片时使用位置。它不一致吗?是。你应该避免吗?是。这是ix被弃用的主要原因。

显式优于隐式,因此当存在歧义时,请使用ilocloc。如果您尝试按位置访问项目,loc将始终引发KeyError,如果您尝试按标签访问,iloc将始终引发KeyError。

相关问题