对@AlexLenail评论的更新
他说的没错,这对于大型列表来说会很慢。我做了更多的调查,并发现索引和列都可以使用intersection
方法。我不确定算法复杂度,但实际上要快得多。
你可以像这样做。
good_keys = df.index.intersection(all_keys)
df.loc[good_keys]
就像你的例子一样
df = pd.DataFrame([1], index=['1'])
df.loc[df.index.intersection(['2'])]
以下是一个小实验
n = 100000
rand_val = np.random.rand(n)
rand_idx = []
for x in range(n):
rand_idx.append(str(x))
bad_idx = []
for x in range(n*2):
bad_idx.append(str(x))
df = pd.DataFrame(rand_val, index=rand_idx)
df.head()
def get_valid_keys_list_comp():
vkeys = [key for key in bad_idx if key in df.index.values]
return df.loc[vkeys]
def get_valid_keys_intersection():
vkeys = df.index.intersection(bad_idx)
return df.loc[vkeys]
%%timeit
get_valid_keys_intersection()
%%timeit
get_valid_keys_list_comp()
原始回答
我不确定 pandas 是否有内置函数来处理这个问题,但是你可以使用 Python 列表推导式来过滤有效的索引,类似于以下方式。
给定一个 DataFrame df2
A B C D F
test 1.0 2013-01-02 1.0 3 foo
train 1.0 2013-01-02 1.0 3 foo
test 1.0 2013-01-02 1.0 3 foo
train 1.0 2013-01-02 1.0 3 foo
你可以使用这个来过滤你的索引查询。
keys = ['test', 'train', 'try', 'fake', 'broken']
valid_keys = [key for key in keys if key in df2.index.values]
df2.loc[valid_keys]
如果您使用 df2.columns
而不是 df2.index.values
,这也适用于列。
df.loc[df.index.intersection(list)]
。 - Alex Lenail