切片 pandas 的 MultiIndex DataFrame

Posted

技术标签:

【中文标题】切片 pandas 的 MultiIndex DataFrame【英文标题】:Slice pandas' MultiIndex DataFrame 【发布时间】:2017-03-28 10:23:53 【问题描述】:

为了跟踪参数化运行中的所有模拟结果,我在 pandas 中创建了一个名为 dfParRun 的 MultIndex 数据帧,如下所示:

import pandas as pd
import numpy as np
import itertools
limOpt = [0.1,1,10]
reimbOpt = ['Cash','Time']
xOpt = [0.1, .02, .03, .04, .05, .06, .07, .08]
zOpt = [1,5n10]
arrays = [limOpt, reimbOpt, xOpt, zOpt]
parameters = list(itertools.product(*arrays))
nPar = len(parameters)

variables = ['X', 'Y', 'Z']
nVar = len(variables)
index = pd.MultiIndex.from_tuples(parameters, names=['lim', 'reimb', 'xMax', 'zMax'])

dfParRun = pd.DataFrame(np.random.rand((nPar, nVar)), index=index, columns=variables)

为了分析我的参数化运行,我想对这个数据框进行切片,但这似乎是一种负担。例如,我希望 xMax 的所有结果都高于 0.5,lim 等于 10。此时,我找到的唯一工作方法是:

df = dfParRun.reset_index()
df.loc[(df.xMax>0.5) & (df.lim==10)]

我想知道是否有一种方法无需重置 DataFrame 的索引?

【问题讨论】:

【参考方案1】:

选项 1 使用pd.IndexSlice 警告:需要sort_index

dfParRun.sort_index().loc[pd.IndexSlice[10, :, .0500001:, :]]

选项 2 在拥有reset_index 之后使用你的df

df.query('xMax > 0.05 & lim == 10')


设置

import pandas as pd
import numpy as np
import itertools
limOpt = [0.1,1,10]
reimbOpt = ['Cash','Time']
xOpt = [0.1, .02, .03, .04, .05, .06, .07, .08]
zOpt = [1, 5, 10]
arrays = [limOpt, reimbOpt, xOpt, zOpt]
parameters = list(itertools.product(*arrays))
nPar = len(parameters)

variables = ['X', 'Y', 'Z']
nVar = len(variables)
index = pd.MultiIndex.from_tuples(parameters, names=['lim', 'reimb', 'xMax', 'zMax'])

dfParRun = pd.DataFrame(np.random.rand(*(nPar, nVar)), index=index, columns=variables)
df = dfParRun.reset_index()

【讨论】:

谢谢!似乎对索引进行排序是我对如何使用 DataFrame 的理解所缺少的。不排序,函数报错。

以上是关于切片 pandas 的 MultiIndex DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

Pandas MultiIndex 中列的条件切片

从具有多个切片的 pandas MultiIndex 中检索列 [重复]

pandas分层索引(层级索引MultiIndex)的创建取值切片统计计算以及普通索引和层级索引的转换方法

Pandas Dataframe 日期时间切片与 Index vs MultiIndex

python 3 pandas和seaborn使用swarmplot进行斗争-multiIndex

Python Pandas Multiindex Slicing/Indexing 获取重复数据