我有一个带有多索引的数据框,只需要选择第一个索引不在列表中的行。这有效:
df= df.iloc[~(df.index.get_level_values(0).isin(mylist) )
这不是:
df= df.iloc[(df.index.get_level_values(0) not in mylist )
我收到有关数组真值的错误。
为什么呢?这是什么意思?是否在官方文档中有记录?
答案 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