我有一个包含这些索引和值的数据框:
df[df.columns[0]]
1 example
2 example1
3 example2
当我访问df [df.columns [0]] [2]时,我得到“example1”.说得通.这就是指数的运作方式.
然而,当我访问df [df.columns [0]]时,我得到了“example”,当我访问df [df.columns [1]]时我得到了例子.因此对于
df[df.columns[0]][0]
df[df.columns[0]][1]
我得到“榜样”.
奇怪的是,我可以删除“row”0,结果是1被删除:
gf = df.drop(df.index[[0]])
gf
exampleDF
2 example1
3 example2
但是当我删除第1行时,那么
2 example1
被删除,而不是示例.
这对我来说有点混乱; Pandas中关于行索引的标准是否存在不一致,或者我错过了什么/出错了?
最佳答案 您可能导致pandas在.iloc(基于索引)和.loc(基于标签)索引之间切换.
Python中的所有数组都是0索引的.我注意到你的DataFrame中的索引是从1开始的.所以当你运行df [df.column [0]] [0]时,pandas意识到没有名为0的索引,并且回退到.iloc,它通过数组定位东西索引.因此,它返回它在数组的第一个位置找到的内容,即“示例”.
然而,当您运行df [df.column [0]] [1]时,pandas意识到存在索引标签1,并使用.loc返回它在该标签处找到的内容,这又是“示例”.
删除第一行时,您的DataFrame没有索引标签0和1.因此,当您按照自己的方式在这些位置查找元素时,它不会返回None,而是返回基于数组的索引并返回数组中第0位和第1位的元素.
要强制pandas使用两种索引技术之一,请使用.iloc或.loc. .loc是基于标签的,如果你尝试df [df.column [0]].loc [0]会引发KeyError. .iloc是基于索引的,当你尝试df [df.column [0]]时会返回’example’.iloc [0].
附加说明
这些命令是不好的做法:df [col_label] .iloc [row_index]; DF [col_label]的.loc [ROW_LABEL].
请使用df.loc [row_label,col_label];或者df.iloc [row_index,col_index];或者df.ix [row_label_or_index,col_label_or_index]
有关更多信息,请参见Different Choices for Indexing.