如何在嵌套字典中按元素访问熊猫多索引?

Posted

技术标签:

【中文标题】如何在嵌套字典中按元素访问熊猫多索引?【英文标题】:How to access pandas multiindex by element within a nested dict? 【发布时间】:2017-01-21 20:17:15 【问题描述】:

我有一个区域类型的字典,在每个子区域的字典内,在每个子区域内,以及每个 Pandas 数据框对象,索引到我需要计算每个参数(列)时间序列的时间段。另外,我需要两个单元。

所以我创造了这样的东西:

regions = ['region_x', 'region_y']
sub_regions = ['a', 'b', 'c']
parameters = ['x', 'y', 'z']
units = ['af', 'cbm']
start = datetime(2000, 01, 01)
end = datetime(2000, 01, 03)

arrays = [parameters * 2, units * 3]

cols = pd.MultiIndex.from_arrays(arrays)
empty_df = pd.DataFrame(index=pd.date_range(start, end), columns=cols).fillna(0.0)

tab_dict = 
for region in regions:
    tab_dict.update(region: )
    for sub_region in sub_regions:
        tab_dict[region].update(sub_region: empty_df)

返回

'region_y':
 'a':       x    y    z    x    y    z
             af  cbm   af  cbm   af  cbm
2000-01-01  0.0  0.0  0.0  0.0  0.0  0.0
2000-01-02  0.0  0.0  0.0  0.0  0.0  0.0
2000-01-03  0.0  0.0  0.0  0.0  0.0  0.0, 
'c':         x    y    z    x    y    z
             af  cbm   af  cbm   af  cbm
2000-01-01  0.0  0.0  0.0  0.0  0.0  0.0
2000-01-02  0.0  0.0  0.0  0.0  0.0  0.0
2000-01-03  0.0  0.0  0.0  0.0  0.0  0.0,
 'b':        x    y    z    x    y    z
             af  cbm   af  cbm   af  cbm
2000-01-01  0.0  0.0  0.0  0.0  0.0  0.0
2000-01-02  0.0  0.0  0.0  0.0  0.0  0.0
2000-01-03  0.0  0.0  0.0  0.0  0.0  0.0,
 'region_x':
 'a':       x    y    z    x    y    z
             af  cbm   af  cbm   af  cbm
2000-01-01  0.0  0.0  0.0  0.0  0.0  0.0
2000-01-02  0.0  0.0  0.0  0.0  0.0  0.0
2000-01-03  0.0  0.0  0.0  0.0  0.0  0.0, 
'c':         x    y    z    x    y    z
             af  cbm   af  cbm   af  cbm
2000-01-01  0.0  0.0  0.0  0.0  0.0  0.0
2000-01-02  0.0  0.0  0.0  0.0  0.0  0.0
2000-01-03  0.0  0.0  0.0  0.0  0.0  0.0,
'b':         x    y    z    x    y    z
             af  cbm   af  cbm   af  cbm
2000-01-01  0.0  0.0  0.0  0.0  0.0  0.0
2000-01-02  0.0  0.0  0.0  0.0  0.0  0.0
2000-01-03  0.0  0.0  0.0  0.0  0.0  0.0

现在我需要从每天提取一个值(在此处使用np.random)并以某种方式将其插入到适当的位置。我已经成功进入单嵌套字典并更新了 DataFrame 对象(使用dict_[key].loc[date] = x),但这里的“类似”方法返回 SettingWithCopyWarning 并且不更新数据帧。

for day in rrule.rrule(rrule.DAILY, dtstart=start, until=end):
    for region in regions:
        for sub_region in sub_regions:
            for parameter in parameters:
                for unit in units:
                    unit_af = np.random.randint(100)
                    unit_cbm = unit_af * 2
                    tab_dict[region][sub_region][parameter]['af'].loc[day] = unit_af
                    tab_dict[region][sub_region][parameter]['cbm'].loc[day] = unit_cbm

它只是返回我开始的内容。对于如何更新这些值的任何建议,我将不胜感激。抱歉代码乱七八糟,这是我能写出的最简单的方法来重现我的(更丑陋的)问题。

【问题讨论】:

【参考方案1】:

loc中指定索引和列 试试

for day in rrule.rrule(rrule.DAILY, dtstart=start, until=end):
    for region in regions:
        for sub_region in sub_regions:
            for parameter in parameters:
                for unit in units:
                    unit_af = np.random.randint(100)
                    unit_cbm = unit_af * 2
                    tab_dict[region][sub_region][parameter].loc[day, 'af'] = unit_af
                    tab_dict[region][sub_region][parameter].loc[day, 'cbm'] = unit_cbm

【讨论】:

以上是关于如何在嵌套字典中按元素访问熊猫多索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何从嵌套字典创建多索引数据框?

访问熊猫数据框中内部多索引级别的最后一个元素

多索引熊猫数据框到字典

具有可迭代对象的字典字典到具有多索引的可迭代对象索引的熊猫数据框

如何在熊猫中使用具有多索引的地图?

如何在熊猫中设置具有多个日期的多索引?