2015-01-27 9 views
1
>new_dat=dat_corr.merge(dat_class,on="Asset",how="right").set_index(['Country','‌​Class','Asset']) 
>new_dat.shape 
(89, 89) 
>temp1='UNITEDSTATES' 
>temp2='Equity' 
>new_dat.loc[ (new_dat.index.get_level_values('Country').isin([temp1]) & new_dat.index.get_level_values('Class').isin([temp2]))]' 
>new_dat.columns=new_dat.index 

Последняя строка дает мне [3 строки х 89 столбцов]. Мои 89 столбцов представляют собой смесь акций/FX/FI/Commodities. Если я хочу только акции США против всех других акций, а не enitre 89 columns, как мне это сделать? Я также добавил несколько индексов для столбцов. Теперь возникает вопрос, что у меня есть мульти индекс вдоль обеих строк и столбцов, как я использую, что для фильтрации ниже небольшое подмножество данных:извлечение подмножества кадра данных с несколькими индексами pandas

Страна UnitedStates КАНАДА \ класса Equity Средства
Asset DJ1Index SP1Index ND1Index PT1Index
Страна Класс активов
UnitedStates Equity DJ1Index 1,000000 0,958038 0,747192 0,648373
SP1Index 0,958038 1,000000 0,825458 0,717545
ND1Index 0,747192 0,825458 1,000000 0,612487
КАНАДА Equity PT1Index 0,648373 0,717545 0,612487 1,000000
МЕКСИКА Equity IS1Index 0,622570 0,664499 0,565702 0,575618

Страна МЕКСИКА БРАЗИЛИЯ ГЕРМАНИЯ ВЕЛИКОБРИТАНИИ \ класса Equity Средства Средства Средства
Asset IS1Index BZ1Index VG1Index Z1Index
Страна Класс активов
UnitedStates Equity DJ1Index 0,622570 0,523704 0,566993 0,520526
SP1Index 0,664499 0,565941 0,587933 0,539138
ND1Index 0,565702 0,484441 0,458135 0,391391
КАНАДА Equity PT1Index 0,575618 0,526663 0,499343 0,493260
МЕКСИКА Equity IS1Index 1,000000 0,577041 0,502558 0,487487

ответ

1

Вы можете добавить столбец (ы) к методу .loc после запятой, как это:

df.loc[(cond1) & (cond2), 'column_name'] 

Этот выход вашего df фильтруются вашими условиями только с одной колонкой column_name.

Вы можете иметь несколько столбцов, если вы поместите их в списке:

df.loc[(cond1) & (cond2), ['column_name1', 'column_name2']] 

Вы можете увидеть docs для более подробной информации.

EDIT:

В случае, если ваши колонки также MultiIndex вы могли бы использовать IndexSlice для этого:

import pandas as pd 
idx = pd.IndexSlice 
df.loc[(cond1) & (cond2), idx[:,'column_name']] 

Обратите внимание, что idx[:,'column_name'] должны быть скорректированы с вашей установки мультииндексных. То есть вы должны иметь : или column_name (ы) на каждом уровне MultiIndex.

Возможно, вы найдете полезные примеры использования этого в MultiIndex docs. Стоит отметить предупреждения о необходимости иметь ваш Index lexsorted, а версия pandas должна быть 0,14. +.

Если вы поставили воспроизводимый пример блока данных, было бы легче дать более конкретный ответ.

+0

Благодарим за отзыв. Однако это не помогает мне достичь того, чего я хотел. Я обновил вопрос. – user2819398

+0

Извините, мне было непонятно. Я добавил дополнительную информацию выше. Надеюсь это поможет. – Primer

+0

> new_dat1 = new_dat.loc [ (new_dat.index.get_level_values ​​('Страна'). ISIN ([TEMP1]) & new_dat.index.get_level_values ​​('Класс'). ISIN ([temp2]))] > new_dat2 = new_dat1.xs (temp3, level = 'Country', axis = 1, drop_level = False) > final_dat = new_dat2.xs (temp4, level = 'Class', axis = 1, drop_level = False) Это было используется для фильтрации для нескольких индексов (строк и столбцов) – user2819398

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