Pandas DataFrame.update,带有MultiIndex标签

时间:2016-05-09 10:53:30

标签: pandas

给定具有MultiIndex的DataFrame A和具有一维索引的DataFrame B,如何使用B中的新值更新A的列值,其中B的索引应与A的第二个索引标签匹配。

测试数据:

begin = [10, 10, 12, 12, 14, 14]
end = [10, 11, 12, 13, 14, 15]
values = [1, 2, 3, 4, 5, 6]
values_updated = [10, 20, 3, 4, 50, 60]

multiindexed = pd.DataFrame({'begin': begin,
                             'end': end,
                             'value': values})
multiindexed.set_index(['begin', 'end'], inplace=True)

singleindexed = pd.DataFrame.from_dict(dict(zip([10, 11, 14, 15],
                                            [10, 20, 50, 60])),
                                   orient='index')
singleindexed.columns = ['value']

理想的结果应该是

               value
begin end       
10    10       10
      11       20
12    12       3
      13       4
14    14       50
      15       60

现在我正在考虑

的变体
multiindexed.update(singleindexed)

我搜索了DataFrame.update的文档,但是找不到任何东西w.r.t.索引处理。

我错过了一种更简单的方法来实现这一目标吗?

1 个答案:

答案 0 :(得分:1)

您可以使用loc选择multiindexed中的数据,然后按values设置新值:

print singleindexed.index
Int64Index([10, 11, 14, 15], dtype='int64')

print singleindexed.values
[[10]
 [20]
 [50]
 [60]]

idx = pd.IndexSlice

print multiindexed.loc[idx[:, singleindexed.index],:]
           value
start end       
10    10       1
      11       2
14    14       5
      15       6

multiindexed.loc[idx[:, singleindexed.index],:] = singleindexed.values
print multiindexed
           value
start end       
10    10      10
      11      20
12    12       3
      13       4
14    14      50
      15      60

Using slicers in docs