有没有一种简单的方法来索引列表(或数组,或其他)的所有元素,除了特定的索引?例如,
mylist[3] 将返回位置3的项目
milist[~3] 将返回除3之外的整个列表
我有一个包含3个MultiIndex级别的pandas数据帧.我试图根据对应于两个级别的值列表拉出此数据帧的行.
我有这样的事情:
ix = pd.MultiIndex.from_product([[1, 2, 3], ['foo', 'bar'], ['baz', 'can']], names=['a', 'b', 'c'])
data = np.arange(len(ix))
df = pd.DataFrame(data, index=ix, columns=['hi'])
print(df)
hi
a b c
1 foo baz 0
can 1
bar baz 2
can 3
2 foo baz 4
can 5
bar baz 6
can 7
3 foo baz 8
can 9
bar baz 10
can 11
Run Code Online (Sandbox Code Playgroud)
现在我想要获取索引级别'b'和'c'在此索引中的所有行:
ix_use = pd.MultiIndex.from_tuples([('foo', 'can'), ('bar', 'baz')], names=['b', 'c'])
Run Code Online (Sandbox Code Playgroud)
即值hi具有('foo', 'can')或('bar', 'baz')在水平b和 …
我有一个包含数据的大型数据框,以及包含每个时间点元数据的相同第一维的另一个数据框(例如,它是什么试用版,它是什么样的试用版).
我想要做的是使用"metadataframe"的值来切割大型数据帧.我想保持这些独立(而不是将元数据帧存储为较大元数据的多索引).
现在,我正在尝试做这样的事情:
def my_func(container):
container.big_df.set_index(container.meta_df[['col1', 'col2']])
container.big_df.loc['col1val', 'col2val'].plot()
Run Code Online (Sandbox Code Playgroud)
但是,这会返回以下错误:
ValueError: Must pass DataFrame with boolean values only
Run Code Online (Sandbox Code Playgroud)
请注意,如果我只将一个列传递给set_index,这样可以正常工作.
谁能弄明白这里出了什么问题?或者,有人可以告诉我,我是以一种完全愚蠢和愚蠢的方式做到这一点,并且有一个更好的方法去做吗?:)
我的解决方案
谢谢你的想法.我玩了索引一点点,这似乎是最简单/最快的.我不喜欢剥离其名称的索引,并且转换值等似乎很麻烦.我意识到一些有趣的东西(可能很容易修复):
dfa.set_index(dfb[['col1', 'col2']])
Run Code Online (Sandbox Code Playgroud)
不起作用,但是
dfa.set_index([dfb.col1, dfb.col2])
Run Code Online (Sandbox Code Playgroud)
确实.
因此,您基本上可以将dfb转换为列列表,使set_index工作,遵循以下约定:
dfa.set_index([dfb[col] for col in ['col1', 'col2']])
Run Code Online (Sandbox Code Playgroud) 我经常遇到这样的情况:我有一个 pandas 多重索引,其级别如下:
ix = pd.MultiIndex.from_tuples(((1, 2),
(1, 3),
(2, 2),
(2, 5)), names=['hi', 'there'])
a = pd.DataFrame([0]*4, index=ix, columns=['foo'])
Run Code Online (Sandbox Code Playgroud)
具有这种结构:
print a
foo
hi there
1 2 0
3 0
2 2 0
5 0
Run Code Online (Sandbox Code Playgroud)
但是,我想扩展这些索引,例如每个级别 3 个新索引。所以我想添加另一个索引,使最终产品看起来像这样:
foo
hi there newix
1 2 1 0
2 0
3 1 0
2 0
2 2 1 0
2 0
5 1 0
2 0
Run Code Online (Sandbox Code Playgroud)
我想不出使用“from_product”之类的明显方法来做到这一点。我想我可以通过迭代前两行来手动构造元组,但这看起来很麻烦。有没有比我想象的更优雅的方法来实现这一点?
编辑:理想情况下,这将不是这样的:
newixs = []
for ix in a.index:
for i in range(5):
nix = …Run Code Online (Sandbox Code Playgroud) 因此,这听起来有些令人费解,但是最近我在joblib中遇到了一个问题,即它将创建一堆进程,然后挂在那儿(也就是,每个进程占用内存,但不占用CPU时间)。
这是我得到的最简单的代码,可以重现该问题:
from sklearn import linear_model
import numpy as np
from sklearn import cross_validation as cval
from joblib import Parallel, delayed
def fit_hanging_model(n=10000, nx=10, ny=32, ndelay=10,
n_cvs=5, n_jobs=None):
# Create data
X = np.random.randn(n, ny*ndelay)
y = np.random.randn(n, nx)
# Create model + CV
model = linear_model.Ridge(alpha=1000.)
cvest = cval.KFold(n, n_folds=n_cvs, shuffle=True)
# Fit model
par = Parallel(n_jobs=n_jobs, verbose=10)
parfunc = delayed(_fit_model_cvs)
par(parfunc(X, y, train, test, model)
for i, (train, test) in enumerate(cvest))
def _fit_model_cvs(X, Y, train, test, model):
model.fit(X, …Run Code Online (Sandbox Code Playgroud) python ×5
pandas ×3
numpy ×2
scikit-learn ×2
scipy ×2
dataframe ×1
indexing ×1
list ×1
multi-index ×1