Pandas 高效的 Multiindex 获取和设置

Posted

技术标签:

【中文标题】Pandas 高效的 Multiindex 获取和设置【英文标题】:Pandas efficient Multiindex getting and setting 【发布时间】:2018-01-26 09:22:07 【问题描述】:

下面是我在 pandas 中的数据结构的快照

我在 for 循环中构建以下结构

我正在使用 sortlevel 对数据帧进行 lexsort

df.sortlevel(inplace=True)

1) 我需要一种有效的方法来获取和设置特定的行,如下所示。这是我使用的公式,效率不高。 a) 我可以使用赋值设置行的值吗

df.loc[idx['AAA', slice(None),'LLL']].iloc[:,0:n]

df.loc[idx['AAA', slice(None),'LLL']].iloc[:,0:n] = another_df

2) 如何有效地对以下结果的列求和

df.loc[idx['AAA', slice(None),'LLL']].iloc[:,0:n].sum(axis=1)

我正在寻找一种对数据帧进行切片的有效方法。

谢谢

【问题讨论】:

您可以将您的示例 DF 作为文本发布吗? 请阅读how to make good reproducible pandas examples并相应地编辑您的帖子。 pandas.pydata.org/pandas-docs/stable/indexing.html 【参考方案1】:

感谢您让我知道为 Pandas 发布问题的正确方法。无论如何,以下是我对这个问题的发现。从组织数据和导出到 csv 或 excel 的角度来看,Multindex 无疑是强大的。然而,访问和选择数据一直具有挑战性。

初始化多索引的最佳实践

    我发现预分配索引比动态创建索引更容易。动态创建索引效率不高,您将面临 lexsort 警告。 数据框初始化后对数据框索引进行排序。

    访问时不要将行或列标识符留空。使用:

    for site_name in site_s:
    
    no_of_progs =  len(site_s[site_name])
    prog_name_in_sites = site_s[site_name].keys()
    prog_level_cols = ['A','B', 'C']
    prog_level_cols = ['A', 'C']
    
    site_level_cols = ['A PLAN', 'A TOTAL','A UP','A DOWN','A AVAILABLE' ]
    
    if counter == 0:
        pd_index_col = pd.MultiIndex.from_product([ [site_name], prog_name_in_sites,prog_level_cols],
                         names=['SITE', 'PROGRAM','TYPE'])
    else: 
        pd_index_col = pd_index_col.append(pd.MultiIndex.from_product([ [site_name], prog_name_in_sites,prog_level_cols],
                         names=['SITE', 'PROGRAM','TYPE']))
    if no_of_progs >1:
        pd_index_col = pd_index_col.append(pd.MultiIndex.from_product([ [site_name], ['LINES']  ,site_level_cols],
                         names=['SITE', 'PROGRAM','TYPE']))
    counter = counter+1
    
    df_A_site_level = pd.DataFrame(0,columns=arr_wk_num_wkly,index= pd_index_col, dtype=np.float64)
    
    df_A_site_level.sort_index(inplace=True)
    

设置和获取以下是我推荐的两种方法

df.iloc - 如果您知道行和/或列的位置索引 df.loc - 如果您想根据标签访问数据

使用 loc 访问 - 使用以下设置或获取单元格/行值

idx = pd.IndexSlice
df_A_site_level[idx[site_name, :,'C'], df_A_site_level[0:no]]

使用 iloc 访问 - 使用以下设置或获取单元格/行值

df_A_site_level.iloc[no_1:no_2,no3:no_4]

【讨论】:

以上是关于Pandas 高效的 Multiindex 获取和设置的主要内容,如果未能解决你的问题,请参考以下文章

Pandas GroupBy 和 MultiIndex 上列级别的最大值

Pandas:使用 MultiIndex 列按不同列聚合

在 Multiindex Pandas 系列中获取每个组中最大的

根据条件获取pandas multiindex中的索引值

Python Pandas Multiindex Slicing/Indexing 获取重复数据

使用元组键从字典创建 MultiIndex pandas DataFrame