当前位置: 首页 > 知识库问答 >
问题:

使用基于索引的条件对多索引数据帧进行切片[重复]

令狐嘉禧
2023-03-14

我有一个数据框架,看起来像这样:

import pandas as pd
import numpy as np

arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']), np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])]
df = pd.DataFrame([[24, 13,  8,  9],
   [11, 30,  7, 23],
   [21, 31, 12, 30],
   [ 2,  5, 19, 24],
   [15, 18,  3, 16],
   [ 2, 24, 28, 11],
   [23,  9,  6, 12],
   [29, 28, 11, 21]], index=arrays, columns=list('abcd'))


df
          a   b   c   d
bar one  24  13   8   9
    two  11  30   7  23
baz one  21  31  12  30
    two   2   5  19  24
foo one  15  18   3  16
    two   2  24  28  11
qux one  23   9   6  12
    two  29  28  11  21

我想对数据帧进行切片,以便结果包含所有以<code>foo

          a   b   c   d
bar two  11  30   7  23
foo one  15  18   3  16
    two   2  24  28  11

获得此结果的一种方法是

pd.concat([df.loc[[('bar', 'two')],:], df.loc[('foo', slice(None)),:]])

但这感觉像是一个非常繁琐的方法,必须有一个更“pythonic”的方法..

共有2个答案

胡承悦
2023-03-14

您可以使用默认切片

l0 = df.index.get_level_values(0)
l1 = df.index.get_level_values(1)
cond = (l0 == "foo") | ((l0=="bar") & (l1=="two"))
df[cond]

输出

        a   b   c   d
bar two 11  30  7   23
foo one 15  18  3   16
    two 2   24  28  11
梁丘洲
2023-03-14

查询到救援:

df.query('ilevel_0 == "foo" or (ilevel_0 == "bar" and ilevel_1 == "two")')

          a   b   c   d
bar two  11  30   7  23
foo one  15  18   3  16
    two   2  24  28  11

xsloc等都失败了,因为跨级别的切片不一致。

 类似资料:
  • 我有一个多索引数据框,看起来像 uid tid文本 abc x t1 bcd y t2 uid 和 tid 是索引。我有一个 uid 列表,并希望获取与该列表中的 uid 相对应的行,但保留第 2 级索引值 (tid)。我想在不运行任何显式循环的情况下执行此操作。这可能吗?

  • 我有两个形状相同的python数据帧,例如: 我想使用df2中的值作为行索引来选择df1中的值,并创建一个形状相等的新数据帧。预期结果: 我已尝试使用.loc,它在单个列中运行良好: 但是我不能同时在所有列上使用. loc或. iloc。我想避免循环来优化性能,因为我正在处理一个大数据帧。有什么想法吗?

  • 我有一个dataframe,。 我想选择中不在列表中的所有索引,

  • 如果我定义一个像这样的分层索引数据框: 内容如下所示: 我知道如何提取与给定列对应的数据。例如。对于列: 如何提取符合以下标准集的数据: , , , column , , 列 和 、、列、以及从开始的所有列 是偶数 (顺便说一句,我做了不止一次rtfm,但我真的觉得难以理解。)

  • 我正在尝试使用多级索引对数据帧进行子集。例如: 如您所见,df2包含带有state和office_id多级索引。对于df2,我想通过使用multindex find来对dataframe进行子集: 在历史上,我会将索引放在dataframe和列的子集中,但这样做效率不高。 谁能给我指出正确的方向吗?谢谢你!

  • 我正在尝试从多索引数据帧中仅使用一个索引来创建新的数据帧。 理想情况下,我想要这样的东西: 和: 基本上,我想删除除level之外的多索引的所有其他索引。有没有一个简单的方法可以做到这一点?