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 上列级别的最大值
在 Multiindex Pandas 系列中获取每个组中最大的