以下是我的例子:
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
我发现它非常令人困惑,而且很奇怪它背后的原因是什么?
答案 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
的索引标签位置。
答案 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
被弃用的主要原因。
显式优于隐式,因此当存在歧义时,请使用iloc
或loc
。如果您尝试按位置访问项目,loc
将始终引发KeyError,如果您尝试按标签访问,iloc
将始终引发KeyError。