Pandas高效的Multiindex获取和设置

时间:2017-08-17 19:54:40

标签: python pandas dataframe multi-index

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

  • 我在for循环中构建了以下结构
  • 我使用sortlevel来lexsort数据帧

    df.sortlevel(就地= TRUE)

enter image description here

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

设置行的值
df.loc[idx['AAA', slice(None),'LLL']].iloc[:,0:n]

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

enter image description here

2)如何有效地对下面的结果列进行求和

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

enter image description here

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

由于

1 个答案:

答案 0 :(得分:0)

感谢您让我知道为熊猫发布问题的正确方法。以下任何情况都是我对此问题的调查结果。从组织数据和导出到csv或excel的角度来看,Multindex肯定是强大的。但是,访问和选择数据一直很难实现。

初始化多索引的最佳做法

  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)
    
  4. 设置和获取以下是我推荐的两种方法

    • 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]