2015-05-08 2 views
4

У меня есть блок данных Pindas multiindex, и мне нужно присвоить значения одному из столбцов из серии. Серия делится своим индексом с первым уровнем индекса кадра данных.Назначение значений Pandas Multiindex DataFrame по уровню индекса

import pandas as pd 
import numpy as np 
idx0 = np.array(['bar', 'bar', 'bar', 'baz', 'foo', 'foo']) 
idx1 = np.array(['one', 'two', 'three', 'one', 'one', 'two']) 
df = pd.DataFrame(index = [idx0, idx1], columns = ['A', 'B']) 
s = pd.Series([True, False, True],index = np.unique(idx0)) 
print df 
print s 

из:

   A B 
bar one NaN NaN 
    two NaN NaN 
    three NaN NaN 
baz one NaN NaN 
foo one NaN NaN 
    two NaN NaN 

bar  True 
baz False 
foo  True 
dtype: bool 

Они не работают:

df.A = s # does not raise an error, but does nothing 
df.loc[s.index,'A'] = s # raises an error 

ожидается выход:

   A  B 
bar one True NaN 
    two True NaN 
    three True NaN 
baz one False NaN 
foo one True NaN 
    two True NaN 

ответ

5

Series (и словари), могут быть использованы так же, как функции с картой и применить (спасибо @norman IUS для улучшения синтаксиса):

df['A'] = pd.Series(df.index.get_level_values(0)).map(s).values 

Или так же:

df['A'] = df.reset_index(level=0)['level_0'].map(s).values 

Результаты:

A B 
bar one  True NaN 
    two  True NaN 
    three True NaN 
baz one False NaN 
foo one  True NaN 
    two  True NaN 
+0

мне интересно, если это ошибка, что он не работает, если значения прошло имеют значения индекса, которые могут быть выровнены, во всяком случае +1 – EdChum

+1

Я не мог понять, какой синтаксис должен использовать '.loc' либо для назначения значений, надеюсь, что лучший человек-панда ответит на это. Для меня это должно работать, поэтому должен быть способ сделать это, не прибегая к «карте» – EdChum

+0

О, я думал, что вы имеете в виду что-то еще. Я считаю, что карта так же хороша, как и любая другая. Также можно выполнить слияние, но я подозреваю, что это немного медленнее (но, возможно, более ясное для чтения). – JohnE

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