下面是我在pandas中的数据结构的快照
我使用sortlevel来lexsort数据帧
df.sortlevel(就地= 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)
我正在寻找一种切片数据帧的有效方法。
由于
答案 0 :(得分:0)
感谢您让我知道为熊猫发布问题的正确方法。以下任何情况都是我对此问题的调查结果。从组织数据和导出到csv或excel的角度来看,Multindex肯定是强大的。但是,访问和选择数据一直很难实现。
初始化多索引的最佳做法
访问时不要将行或列标识符留空。使用:
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]