Pandas 高效的多索引获取和设置
Pandas efficient Multiindex getting and setting
下面是我在 pandas
中的数据结构的快照
我在 for 循环中构建以下结构
我正在使用 sortlevel 对数据帧进行词法排序
df.sortlevel(inplace=True)
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 无疑是强大的。然而,访问和选择数据一直难以完成。
初始化多索引的最佳实践
- 我发现预分配索引比动态创建索引更容易。即时创建索引效率不高,您将面临 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
- 如果你知道行的位置索引 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]
下面是我在 pandas
中的数据结构的快照我在 for 循环中构建以下结构
我正在使用 sortlevel 对数据帧进行词法排序
df.sortlevel(inplace=True)
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 无疑是强大的。然而,访问和选择数据一直难以完成。
初始化多索引的最佳实践
- 我发现预分配索引比动态创建索引更容易。即时创建索引效率不高,您将面临 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
- 如果你知道行的位置索引 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]