gpt4 book ai didi

python - 如何用另一个的 MultiIndex 对一个 MultiIndex DataFrame 进行切片

转载 作者:IT老高 更新时间:2023-10-28 21:12:02 33 4
gpt4 key购买 nike

我有一个带有 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

现在我想获取索引级别“b”和“c”在此索引中的所有行:

ix_use = pd.MultiIndex.from_tuples([('foo', 'can'), ('bar', 'baz')], names=['b', 'c'])

hi 的值在级别 b 中具有 ('foo', 'can')('bar', 'baz') c 分别为:(1, 2, 5, 6, 9, 10).

所以我想在第一层取一个 slice(None),并在第二层和第三层提取特定的元组。

最初我认为将多索引对象传递给 .loc 会提取出我想要的值/级别,但这不起作用。做这种事情的最佳方法是什么?

最佳答案

这是获取此切片的一种方法:

df.sort_index(inplace=True)
idx = pd.IndexSlice
df.loc[idx[:, ('foo','bar'), 'can'], :]

屈服

           hi
a b c
1 bar can 3
foo can 1
2 bar can 7
foo can 5
3 bar can 11
foo can 9

请注意,您可能需要先对 MultiIndex 进行排序,然后才能对其进行切片。如果您需要这样做,pandas 会很友好地发出警告:

KeyError: 'MultiIndex Slicing requires the index to be fully lexsorted tuple len (3), lexsort depth (1)'

您可以在 docs 中阅读有关如何使用切片器的更多信息。

如果由于某种原因不能使用切片器,这里是一种使用 .isin() 方法获得相同切片的方法:

df[df.index.get_level_values('b').isin(ix_use.get_level_values(0)) & df.index.get_level_values('c').isin(ix_use.get_level_values(1))]

这显然不是那么简洁。

更新:

对于您在这里更新的条件是一种方法:

cond1 = (df.index.get_level_values('b').isin(['foo'])) & (df.index.get_level_values('c').isin(['can']))
cond2 = (df.index.get_level_values('b').isin(['bar'])) & (df.index.get_level_values('c').isin(['baz']))
df[cond1 | cond2]

制作:

           hi
a b c
1 foo can 1
bar baz 2
2 foo can 5
bar baz 6
3 foo can 9
bar baz 10

关于python - 如何用另一个的 MultiIndex 对一个 MultiIndex DataFrame 进行切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29266600/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com