我正在尝试使用整数索引值从 Pandas DataFrame 中选择行。
这不起作用,并且我获得了索引错误。
- 这表明,按索引选择行隐式地会导致
reset_index()
被调用,尽管我可能错了 - 下面的例子解释了为什么我观察到的行为表明了这一点
import pandas
data = {
'number': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'fruit': 3 * ['apple'] + 3 * ['pear'] + 2 * ['banana'] + ['pear'] + ['apple'],
'color': 3 * ['red', 'green', 'blue'] + ['red'],
'letter': 5 * ['A', 'B'],
}
df = pandas.DataFrame(data)
df
df_selected = df[df['fruit'] == 'pear']
df_selected
df_selected.index
Index([3, 4, 5, 8], dtype='int64')
这当然表明我有一个 DataFrame,其索引包含值 3、4、5 和 8。
我现在想使用整数索引选择 DataFrame 中从第一次出现“pear”到最后一次出现的所有行:
我认为使用以下语法应该可以实现:
FIRST = 3
LAST = 8
df_selected[FIRST:LAST+1]
但我错了:
- 打印时(显示 DataFrame 到
stdout
或 Jupyter Notebook Cell)索引显示值3, 4, 5, 8
。 - 当使用语法
df_selected[A:B]
或df_selected.iloc[A:B]
整数参数按索引进行选择时A
,它们B
被解释为df_selected.reset_index()
已被调用 - 我这样说是因为调用
reset_index()
会产生以下输出
这意味着按索引选择时使用的正确范围是df_selected.iloc[0:3+1]
我知道这是一个非常基本的问题,但我希望有人可以给我指出正确的方向,让我理解为什么会出现这样的行为,如果有特殊的原因的话。
您应该使用
loc
按标签进行选择:或者:
注意:由于
loc
包括两端,因此您不需要+1
。输出:
当使用 时
df_selected[1:2]
,其行为类似于iloc
并从第四到第九个位置进行选择(因此仅选择带有标签的行8
)。选择
如果您的目标是选择第一个和最后一个匹配之间的所有值,那么您也可以使用布尔索引:
怎么运行的: