2015-04-14 2 views
1

Вот тривиальный панды DataFrame, с индексом двухуровневой и столбца одного значения:Как выбрать строки из индексированных pandas DataFrame, используя второй индексированный столбец?

  value 
| k1 | k2 |  | 
+----+----+-------+ 
| a | b | c  | 
| d | e | f  | 
| g | h | i  | 

можно выбрать строки с помощью k1, как то:

df.loc[['a','d'], :] 

и получить:

  value 
| k1 | k2 |  | 
+----+----+-------+ 
| a | b | c  | 
| d | e | f  | 

Но, при попытке же с k2, как и что:

df.loc[:, ['b','e']] 

я получаю исключение KeyError: "Ни один из [[ 'B', 'е']] находятся в [столбцов]"

Что я здесь отсутствует?

ответ

1

Вы можете сделать это так:

df.loc[(slice(None), ['b', 'e']), :] 

Более подробное объяснение:

При выполнении df.loc[idx_row, idx_col], индексатор «idx_row» (в вашем случае список ['a','d']) индексов строки (так что ваш мульти -index), а 'idx_col' (в вашем случае :) индексирует столбцы (в данном случае: все столбцы).
Итак, вы хотите указать оба уровня мультииндекса в указателе строк ('idx_row'). Если вы хотите выбрать второй уровень, вам нужно указать, что вы хотите включить все элементы первого уровня с помощью среза, поэтому «idx_row» становится (:, ['b', 'e']). Единственная проблема заключается в том, что вы не можете использовать : внутри кортежа, поэтому вам нужно использовать эквивалент slice(None).
Панда обеспечивает небольшой обходной путь, чтобы не использовать более подробный срез:

idx = pd.IndexSlice 
df.loc[idx[:, ['b', 'e']], :] 

Смотрите документацию по этому вопросу: http://pandas.pydata.org/pandas-docs/stable/advanced.html#using-slicers

Смежные вопросы