2

我有一个复杂的 MultiIndex:

import pandas as pd
metrics = ['PT', 'TF', 'AF']
n_replicates = 3
n_nodes = 6
cols = [(r,m,n) for r in range(n_replicates) for m in metrics for n in range(n_nodes)]
cols = pd.MultiIndex.from_tuples(cols,names = ['Replicates', 'Metrics', 'Nodes'])

ind = range(5)
df = pd.DataFrame(columns=cols, index=ind)
df.sortlevel(level=0, axis=1, inplace=True)

它给我带来了一些问题。其中之一是:我想添加一个不具有 MultiIndex 的所有级别的列:

df[r, 'Graph'] = ....

但是,我最终需要做出:

df[r, 'Graph', 0] = ....

当我引用该列时,我还需要使用df[r, 'Graph', 0],这很笨拙,因为在第三级实际上没有发生任何事情。有没有解决的办法?

编辑:更多示例

添加列:df[0,'Graph'] = arange(5) ValueError: invalid entry

df.ix[:,[0,'Graph']] = arange(5)
KeyError: "['Graph'] not in index"

df.xs[0,'Graph'] = arange(5)
TypeError: 'instancemethod' object does not support item assignment

df[0, 'Graph', 0] = arange(5) #Works! But I have to reference a lower level that doesn't mean anything for this 'Graph' column.

从列中读取:df.ix[:, [0,'Graph']] #给出整个df[0],而不仅仅是[0,'Graph']列

df[0, 'Graph']
KeyError: 'MultiIndex lexsort depth 0, key was length 2'

df.sortlevel(level=0, axis=1, inplace=True)
df[0, 'Graph'] #Works! Though if one is making many manipulations to the dataframe then this sortlevel needs to be called a lot.

杰夫的第二条评论的进一步编辑:我很欣赏需要具有多索引所有级别的给定列。我曾考虑过只使用另一个框架,尽管我想将数据全部保存在一个单元中,以便存储在 HDF5 等中。对此的答案是面板。但是,我最终将在这个级别之上有几个级别,如果可能的话,我对面板面板的面板持怀疑态度。我绝对愿意接受其他我没有考虑过的攻击角度,从而消除所有这些问题。

4

0 回答 0