При индексировании многоканального 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