2016-11-18 3 views
1

У меня есть многоиндексной dataframe как:класть состояние в пандах dataframe (мультииндекс)?

df = 
    sta1     sta2   ...    stan 
    coef e  p  coef e  p  ... coef e p 
t 3  0.1 0.001 2  0.1 0.001    1 0.1 0.01 
u 3  0.2 0.01  3  0.01 0.01    2 0.1 0.001 
v 2  0.1 0.001 4  0.1 0.1    2 0.001 0.001 

Я хочу поставить условие, если р> 0,01 то коэф = нан. Мои результаты выглядят так:

df = 
    sta1     sta2   ...    stan 
    coef e  p  coef  e  p  ... coef e p 
t 3  0.1 0.001 nan  0.1 0.1    1 0.1 0.01 
u 3  0.2 0.01  3  0.01 0.01    nan 0.1 0.1 
v 2  0.1 0.001 nan  0.1 0.1    2 0.001 0.001 

Я ценю это, если кто-то ведет меня. Спасибо.

ответ

1

Я испытал это на моих случайных данных, пожалуйста, скажите мне, если он работает на вашем примере:

for multindex in df.columns.values: 
    if multindex[1] == 'p': 
     df[(multindex[0], 'coef')] = np.where(df[multindex] > 0.01, np.nan, df[(multindex[0], 'coef')]) 
+0

Да, это работает. Благодаря! – zhr

1

Попробуйте это:

Если у вас есть следующие DF:

In [117]: df 
Out[117]: 
    stat1    stat2    stat3 
    coef e  p coef  e  p coef  e  p 
0 
t  3 0.1 0.001  2 0.10 0.001  1 0.100 0.010 
u  3 0.2 0.010  3 0.01 0.010  2 0.100 0.001 
v  2 0.1 0.001  4 0.10 0.100  2 0.001 0.001 

вы можете использовать pd.IndexSlice[...] метод и @jezrael's idea of renaming column names in the mask:

In [118]: mask = df.loc[:, idx[:, ['p']]] > 0.01 

In [119]: mask 
Out[119]: 
    stat1 stat2 stat3 
     p  p  p 
0 
t False False False 
u False False False 
v False True False 

In [120]: df[mask.rename(columns={'p':'coef'})] = np.nan 

In [121]: df 
Out[121]: 
    stat1    stat2    stat3 
    coef e  p coef  e  p coef  e  p 
0 
t  3 0.1 0.001 2.0 0.10 0.001  1 0.100 0.010 
u  3 0.2 0.010 3.0 0.01 0.010  2 0.100 0.001 
v  2 0.1 0.001 NaN 0.10 0.100  2 0.001 0.001 

Объяснение:

In [123]: mask 
Out[123]: 
    stat1 stat2 stat3 
     p  p  p 
0 
t False False False 
u False False False 
v False True False 

In [124]: mask.rename(columns={'p':'coef'}) 
Out[124]: 
    stat1 stat2 stat3 
    coef coef coef 
0 
t False False False 
u False False False 
v False True False 
+0

Nice решение, возможно, '' OP' хотят <0.01' – jezrael

+0

@jezrael, спасибо! Я просто понял, что OP хочет изменить 'coef' вместо' p' - я исправлю свой ответ ... – MaxU

+0

Я начинаю решать этот вопрос, но это вы сейчас;) возможно, может помочь переименовать 'p' в' coef' в 'mask' (я не уверен) – jezrael

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