首页 > 解决方案 > 如何从另一个数据帧更新多索引数据帧?

问题描述

我有一个看起来像这样的 DataFrame:

                                     Something1                        Something2 
                              date  2020-03-30  2020-03-31  2020-04-01  2020-03-30  2020-03-31  2020-04-01  
index_1 index_2  index_3 index_4                                                                                    
A0        B0       C0        D0         10         NaN         11         'bla'          'bli'    'blo'
A1        B1       C1        D1         8          NaN         NaN        'bla1'         'bli1    'blo1'
A2        B2       C2        D0         0          NaN         303        'bla2'         'bli2'   'blo2'

当 index_[1|2|3|4] 是 MultiIndex 时。Some[1|2] 是第一级列。并且日期是重复的第二级列,它们在 Something[1|2] 第一级列中是相同的。

现在,我得到了一个不同的表,其中包含我想用我当前的表来丰富的值。新表如下所示

index_4      date          val  
   D0      2020-03-30      8
   D0      2020-03-31      9
   ...
   D1      2020-03-30      17
   D1      2020-03-31      33

我想用旧表来丰富旧表。

我的问题是:如何使用新表填充旧表 - 当我只想在 中设置值时Something1,它看起来像(2020-03-31在 Something1 中的日期中填充 D0 之后):

                                     Something1                        Something2 
                              date  2020-03-30  2020-03-31  2020-04-01  2020-03-30  2020-03-31  2020-04-01  
index_1 index_2  index_3 index_4                                                                                    
A0        B0       C0        D0         10         9           11       'bla'          'bli'      'blo'
A1        B1       C1        D1         8          NaN         NaN      'bla1'         'bli1'     'blo1'
A2        B2       C2        D0         0          9           303      'bla2'         'bli2'     'blo2'

我尝试使用set_value,设置值xsat但我找不到正确的组合来到达正确的单元格。(也在这篇文章中寻找了一些想法,但没有成功)
我想它应该看起来像这样

df.at[index_4='D0']['Something1']['2020-03-31'] = new_df['D0', '2020-03-31']['val']

标签: pythonpython-3.xpandas

解决方案


我能想到的一种方法是重塑数据,以便我们可以拥有index_4date作为索引,映射值并重新整形:

df2 = df2.set_index(['date','index_4'])

s = df['S1'].unstack(level=-1).T
df['S1'] = s.apply(lambda x: x.fillna(df2['val'])).T.stack(level=-1)

推荐阅读