Python 按索引级别为多索引数据帧赋值

Python 按索引级别为多索引数据帧赋值,python,pandas,multi-index,Python,Pandas,Multi Index,我有一个Pandas多索引数据框,我需要为序列中的一列赋值。该系列与数据帧的第一级索引共享其索引 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],

我有一个Pandas多索引数据框,我需要为序列中的一列赋值。该系列与数据帧的第一级索引共享其索引

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
输出:

这些不起作用:

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
Series(和Dictionary)可以像map和apply函数一样使用(感谢@normanius改进了语法):

或类似地:

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

我想知道这是否是一个错误,如果传递的值具有可以对齐的索引值,那么它就不起作用了,无论如何+1我无法确定应该使用
.loc
来指定值的语法,希望更好的熊猫人会回答这个问题。对我来说,这应该行得通,所以一定有一种方法可以做到这一点,而不必求助于
map
哦,我还以为你指的是别的东西呢。我认为map是一种很好的方法。也可以通过合并来实现,但我怀疑这会稍微慢一点(但可能更清晰)。@JohnE:我建议编写
df['a']=pd.Series(df.index.get_level_values(0)).map(s)。values
,这比您的示例更健壮、更清晰。@normanius谢谢!我甚至不记得回答过这个问题,但我完全同意你的评论,并编辑了你的建议。
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