首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从多指标大熊猫中选择

从多指标大熊猫中选择
EN

Stack Overflow用户
提问于 2013-09-16 18:45:37
回答 7查看 203.4K关注 0票数 137

我有一个包含'A‘和'B’列的多索引数据框架。

是否有一种方法可以通过过滤多个索引的一列来选择行,而不将索引重置为单个列索引?

例如。

代码语言:javascript
复制
# has multi-index (A,B)
df
#can I do this? I know this doesn't work because the index is multi-index so I need to     specify a tuple

df.ix[df.A ==1]
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-09-16 18:48:54

一种方法是使用get_level_values索引方法:

代码语言:javascript
复制
In [11]: df
Out[11]:
     0
A B
1 4  1
2 5  2
3 6  3

In [12]: df.iloc[df.index.get_level_values('A') == 1]
Out[12]:
     0
A B
1 4  1

在0.13中,您将能够使用 argument

代码语言:javascript
复制
df.xs(1, level='A', drop_level=False) # axis=1 if columns

注意:如果这是列MultiIndex而不是索引,您可以使用相同的技术:

代码语言:javascript
复制
In [21]: df1 = df.T

In [22]: df1.iloc[:, df1.columns.get_level_values('A') == 1]
Out[22]:
A  1
B  4
0  1
票数 188
EN

Stack Overflow用户

发布于 2018-03-01 08:54:30

您还可以使用query,我认为它非常可读性强,而且使用起来非常简单:

代码语言:javascript
复制
import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [10, 20, 50, 80], 'C': [6, 7, 8, 9]})
df = df.set_index(['A', 'B'])

      C
A B    
1 10  6
2 20  7
3 50  8
4 80  9

对于你想要做的事情,你现在可以做的就是:

代码语言:javascript
复制
df.query('A == 1')

      C
A B    
1 10  6

您还可以使用and进行更复杂的查询。

代码语言:javascript
复制
df.query('A >= 1 and B >= 50')

      C
A B    
3 50  8
4 80  9

or

代码语言:javascript
复制
df.query('A == 1 or B >= 50')

      C
A B    
1 10  6
3 50  8
4 80  9

您还可以对不同的索引级别进行查询()。

代码语言:javascript
复制
df.query('A == 1 or C >= 8')

会回来

代码语言:javascript
复制
      C
A B    
1 10  6
3 50  8
4 80  9

如果要在查询中使用变量,请使用@

代码语言:javascript
复制
b_threshold = 20
c_threshold = 8

df.query('B >= @b_threshold and C <= @c_threshold')

      C
A B    
2 20  7
3 50  8
票数 83
EN

Stack Overflow用户

发布于 2013-09-16 18:51:42

您可以使用DataFrame.xs()

代码语言:javascript
复制
In [36]: df = DataFrame(np.random.randn(10, 4))

In [37]: df.columns = [np.random.choice(['a', 'b'], size=4).tolist(), np.random.choice(['c', 'd'], size=4)]

In [38]: df.columns.names = ['A', 'B']

In [39]: df
Out[39]:
A      b             a
B      d      d      d      d
0 -1.406  0.548 -0.635  0.576
1 -0.212 -0.583  1.012 -1.377
2  0.951 -0.349 -0.477 -1.230
3  0.451 -0.168  0.949  0.545
4 -0.362 -0.855  1.676 -2.881
5  1.283  1.027  0.085 -1.282
6  0.583 -1.406  0.327 -0.146
7 -0.518 -0.480  0.139  0.851
8 -0.030 -0.630 -1.534  0.534
9  0.246 -1.558 -1.885 -1.543

In [40]: df.xs('a', level='A', axis=1)
Out[40]:
B      d      d
0 -0.635  0.576
1  1.012 -1.377
2 -0.477 -1.230
3  0.949  0.545
4  1.676 -2.881
5  0.085 -1.282
6  0.327 -0.146
7  0.139  0.851
8 -1.534  0.534
9 -1.885 -1.543

如果您想保持A级别( drop_level关键字参数只能从v0.13.0开始):

代码语言:javascript
复制
In [42]: df.xs('a', level='A', axis=1, drop_level=False)
Out[42]:
A      a
B      d      d
0 -0.635  0.576
1  1.012 -1.377
2 -0.477 -1.230
3  0.949  0.545
4  1.676 -2.881
5  0.085 -1.282
6  0.327 -0.146
7  0.139  0.851
8 -1.534  0.534
9 -1.885 -1.543
票数 38
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18835077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档