我有一只 Pandas DataFrame
,定义如下:
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Aritra'],
'Age': [25, 30, 35],
'Location': ['Seattle', 'New York', 'Kona']},
index=([10, 20, 30]))
但是,当我对此进行索引时DataFrame
,我无法准确预测索引将产生什么类型的对象:
# (1) str
df.iloc[0, df.columns.get_loc('Name')]
# (2) Series
df.iloc[0:1, df.columns.get_loc('Name')]
# (3) Series
df.iloc[0:2, df.columns.get_loc('Name')]
# (4) DataFrame
df.iloc[0:2, df.columns.get_loc('Name'):df.columns.get_loc('Age')]
# (5) Series
df.iloc[0, df.columns.get_loc('Name'):df.columns.get_loc('Location')]
# (6) DataFrame
df.iloc[0:1, df.columns.get_loc('Name'):df.columns.get_loc('Location')]
请注意,上面的每一对都包含相同的数据。(例如,(2)
一个包含单个字符串的 Series、(4)
一个包含单个列的 DataFrame 等)
为什么它们会输出不同类型的对象?我如何预测将输出哪种类型的对象?
根据数据,规则似乎是基于索引中有多少个切片(冒号):
- 0 切片(
(1)
):标量值 - 1 片 (
(2)
,(3)
,(5)
):Series
- 2 片(
(4)
,(6)
):DataFrame
但是,我不确定这是否总是正确的,即使它总是正确的,我想知道为什么会这样背后的机制。
我花了一些时间查看索引文档,但它似乎没有清楚地描述此行为。该函数的文档iloc
也没有描述返回类型。
我也对loc
而不是 的同一问题感兴趣iloc
,但是,由于loc
包括,结果并不那么令人困惑。(也就是说,您无法获得具有不同类型的索引对,而索引应该提取完全相同的数据。)
您已经了解了大概意思。简单来说,重要的不是项目的数量,而是索引器的类型。
您可以将索引作为 0D(使用标量),现在我们只考虑索引:
或 1D (带有切片或可迭代):
然后规则很简单,考虑两个轴,如果两者都是 0D,则会得到一个标量(这里是一个字符串),如果两者都是 1D,则会得到一个 DataFrame,否则是一个 Series:
以下示例可说明这一点: