【发布时间】:2018-02-08 14:21:28
【问题描述】:
在索引 MultiIndex-ed DataFrame 时,.iloc 似乎假设您引用的是索引的“内部级别”,而 .loc 则查看外部级别。
例如:
np.random.seed(123)
iterables = [['bar', 'baz', 'foo', 'qux'], ['one', 'two']]
idx = pd.MultiIndex.from_product(iterables, names=['first', 'second'])
df = pd.DataFrame(np.random.randn(8, 4), index=idx)
# .loc looks at the outer index:
print(df.loc['qux'])
# df.loc['two'] would throw KeyError
0 1 2 3
second
one -1.25388 -0.63775 0.90711 -1.42868
two -0.14007 -0.86175 -0.25562 -2.79859
# while .iloc looks at the inner index:
print(df.iloc[-1])
0 -0.14007
1 -0.86175
2 -0.25562
3 -2.79859
Name: (qux, two), dtype: float64
两个问题:
首先,这是为什么呢?这是一个深思熟虑的设计决定吗?
其次,我可以使用.iloc 来引用索引的外部级别,以产生下面的结果吗?我知道我可以先用get_level_values 找到索引的最后一个成员,然后用.loc-index 找到它,但是如果它可以更直接地完成,可以使用时髦的.iloc 语法或设计的一些现有函数专门针对这种情况。
# df.iloc[-1]
qux one 0.89071 1.75489 1.49564 1.06939
two -0.77271 0.79486 0.31427 -1.32627
【问题讨论】:
-
索引是一个模拟成表格的线性列表。您会注意到,在第二个示例中,索引
-1实际上由 两个 值组成:Name: (qux, two)。更多的是loc允许引用完整索引(例如df.loc['qux', 'two'])或部分索引,但它是有序的。如果你愿意,你可以做一个reset_index并以其他顺序设置索引。
标签: python python-3.x pandas dataframe