python - 在 MultiIndex Pandas DataFrame 中按列进行子选择

标签 python pandas dataframe

我有一个如下所示的数据框:

               u1  u2  u3  u4  u5  u6
level0 level1                        
foo1   x1       0   1   0   0   0   0
       x2       0   1   1   0   1   1
foo2   x3       0   1   0   1   0   1
       x4       1   0   0   0   1   1
foo3   x5       1   0   1   0   0   0
       x6       0   1   1   1   0   0
foo4   x7       1   0   0   1   0   1
       x8       0   1   1   1   0   0

我只想子选择 u3==1 的索引。因此,作为输出,我应该得到如下内容:

               u1  u2  u3  u4  u5  u6
level0 level1                        
foo1   
       x2       0   1   1   0   1   1
foo2   

foo3   x5       1   0   1   0   0   0
       x6       0   1   1   1   0   0
foo4   
       x8       0   1   1   1   0   0

我尝试过这样做:

idx  = pd.IndexSlice
df.loc[idx[:,:],'u2']==1

给出:

level0  level1
foo1    x1         True
        x2         True
foo2    x3         True
        x4        False
foo3    x5        False
        x6         True
foo4    x7        False
        x8         True

但我不知道如何使用它来索引原始数据帧。

感谢任何帮助。

最佳答案

您可以使用query()方法或常规boolean indexing :

In [11]: df.query('u2 == 1')
Out[11]:
               u1  u2  u3  u4  u5  u6
level0 level1
foo1   x1       0   1   0   0   0   0
       x2       0   1   1   0   1   1
foo2   x3       0   1   0   1   0   1
foo3   x6       0   1   1   1   0   0
foo4   x8       0   1   1   1   0   0

In [12]: df.loc[df['u2'] == 1]
Out[12]:
               u1  u2  u3  u4  u5  u6
level0 level1
foo1   x1       0   1   0   0   0   0
       x2       0   1   1   0   1   1
foo2   x3       0   1   0   1   0   1
foo3   x6       0   1   1   1   0   0
foo4   x8       0   1   1   1   0   0

使用.query()方法还允许您按索引级别进行搜索:

In [17]: df.query("level0 in ['foo2','foo3'] and u2 == 1")
Out[17]:
               u1  u2  u3  u4  u5  u6
level0 level1
foo2   x3       0   1   0   1   0   1
foo3   x6       0   1   1   1   0   0

更新:

how can I select all the u? for which the x1==1 and x3==1?

如果您指的是 u1u3 那么有很多方法可以实现这一点:

In [8]: df.query("u1 == 1 and u3 == 1")
Out[8]:
               u1  u2  u3  u4  u5  u6
level0 level1
foo3   x5       1   0   1   0   0   0

In [9]: df.loc[(df['u1'] == 1) & (df['u3'] == 1)]
Out[9]:
               u1  u2  u3  u4  u5  u6
level0 level1
foo3   x5       1   0   1   0   0   0

In [10]: df.loc[df[['u1','u3']].eq(1).all(1)]
Out[10]:
               u1  u2  u3  u4  u5  u6
level0 level1
foo3   x5       1   0   1   0   0   0

关于python - 在 MultiIndex Pandas DataFrame 中按列进行子选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41749459/

相关文章:

python - 从 Python3 中的文件名列表中查找文件的绝对路径

python - 属性错误 : generator object has no attribute 'sort'

python - 用一列的前 n 个字母创建一个新列,其中 n 是另一列中的值

python - 即使index_col=None,Pandas read_excel有时也会创建索引

python - 将数据框中的 NaN 转换为零

python - 在 python 中操作数据帧以进行 Glicko 计算

python - 将 python 列表转换为数据帧时,ValueError : 4 columns passed, 传递的数据有 3 列。如果3通过了如何添加空白值?

python - Ubuntu 18.04 上的 KivyMD 安装错误

python - 列表理解和速度优化

Python Pandas : Going through a list of cycles and making point of interest