Pandas 高效的多索引获取和设置

Pandas efficient Multiindex getting and setting

下面是我在 pandas

中的数据结构的快照

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

设置行的值吗
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)

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

谢谢

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

初始化多索引的最佳实践

  1. 我发现预分配索引比动态创建索引更容易。即时创建索引效率不高,您将面临 lexsort 警告。
  2. 初始化数据帧后,对数据帧索引进行排序。
  3. 访问时不要将行或列标识符留空。使用 :

    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 - 如果你知道行的位置索引 and/or 列
  • df.loc - 如果你想访问基于标签的数据

使用 loc 访问 - 使用下面设置或获取 cell/row 值

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

使用 iloc 访问 - 使用下面设置或获取 cell/row 值

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