选择pandas行:为什么isin()而不是我在mylist中?

时间:2016-03-20 08:09:35

标签: python pandas

我有一个带有多索引的数据框,只需要选择第一个索引不在列表中的行。这有效:

df= df.iloc[~(df.index.get_level_values(0).isin(mylist) )

这不是:

df= df.iloc[(df.index.get_level_values(0) not in mylist )

我收到有关数组真值的错误。

为什么呢?这是什么意思?是否在官方文档中有记录?

1 个答案:

答案 0 :(得分:1)

说,你有一个数据帧df如下:

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(30).reshape((6,5)))
tuples = [(i//2, i%2) for i in range(6)]
df.index = pd.MultiIndex.from_tuples(tuples)
print(df)

        0           1           2           3           4
0   0   0.623671    0.335741    0.035219    0.902372    0.349697
    1   0.487387    0.325101    0.361753    0.935972    0.425735
1   0   0.147836    0.599608    0.888232    0.712804    0.604688
    1   0.156712    0.286682    0.680316    0.104996    0.389507
2   0   0.212923    0.580401    0.02415     0.712987    0.803497
    1   0.804538    0.035597    0.611101    0.328159    0.140793

df.index.get_level_values(0)将返回一个数组:Int64Index([0, 0, 1, 1, 2, 2], dtype='int64')

错误说通过使用in运算符,不清楚是否要检查该数组中的所有元素是否在列表中,或者该数组中的任何元素是否在列表中。您正在将数组与整个列表进行比较。你想要的是元素方面的比较,in不这样做。即使很清楚,它也会返回一个值。另一方面,如果尝试df.index.get_level_values(0).isin([0,1]),它将返回一个布尔值数组:array([ True, True, True, True, False, False], dtype=bool),因此它将首先检查列表中是否为0,列表中是否为第二个0,是否为1在列表中...然后这些布尔值将用于切片数据帧(即仅向我显示数组具有True值的行)。

In [12]: df.iloc[[ True,  True,  True,  True, False, False]]
Out [12]:       0   1           2           3           4
0   0   0.623671    0.335741    0.035219    0.902372    0.349697
    1   0.487387    0.325101    0.361753    0.935972    0.425735
1   0   0.147836    0.599608    0.888232    0.712804    0.604688
    1   0.156712    0.286682    0.680316    0.104996    0.389507