我希望采用带有多索引的数据帧,并将其与另一个(多个)索引一起索引,该索引包含数据帧级别的严格子集。数据框中的级别不在其他(多)索引中,应该返回所有行。一个例子:
df
现在,我想要返回'b'
级别中包含'c'
或'chr'
的所有行'num'
以及MultiIndex
级别中的任何值。另外,我想尝试相同的事情,在最后一步中返回的索引是df
(即,当>>> df
col
num chr foo
1 a bar 0.790995
baz 0.883363
b bar 0.240376
baz 0.309544
c bar 0.637943
baz 0.265628
2 a bar 0.783172
baz 0.612230
b bar 0.729979
baz 0.846814
c bar 0.809676
baz 0.821503
>>> df['col'].unstack(['chr', 'foo']).mean()
chr foo
a bar 0.787084
baz 0.747796
b bar 0.485177
baz 0.578179
c bar 0.723809
baz 0.543565
dtype: float64
>>> df['col'].unstack(['chr', 'foo']).mean().nsmallest(2)
chr foo
b bar 0.485177
c baz 0.543565
dtype: float64
>>> df['col'].unstack(['chr', 'foo']).mean().nsmallest(2).index
MultiIndex(levels=[['a', 'b', 'c'], ['bar', 'baz']],
labels=[[1, 2], [0, 1]],
names=['chr', 'foo'])
的索引有两个以上的级别时):
df
我想选择最后两个级别中索引包含('b', 'bar')
或('c', 'baz')
的所有'num'
行以及def mult_table():
result = []
for i in a:
for j in a:
result.append(i*j)
return result
级别中的任何值。
答案 0 :(得分:0)
我只能使用get_level_values
和isin
s=df['col'].mean(level=[1,2]).nsmallest(2).index.tolist()
df[pd.Series(list(zip(df.index.get_level_values(1),df.index.get_level_values(2)))).isin(s).values]
Out[163]:
col
num chr foo
1 b bar 0.240376
c baz 0.265628
2 b bar 0.729979
c baz 0.821503
答案 1 :(得分:0)
我认为最干净的解决方案可能是单独检索所需的行并pd.concat
。对于Index
解决方案:
idx = df['col'].unstack(['chr', 'foo']).mean().nsmallest(2).index
selected = pd.concat([df.xs(label, level=idx.name, drop_level=False)
for label in idx],
axis=0)
当idx
为MultiIndex
时,请改用level=idx.names
。