熊猫。loc无键错误

&gt&燃气轮机&燃气轮机;pd.DataFrame([1],index=['1']).loc['2']#KeyError
&燃气轮机&燃气轮机&燃气轮机;pd.DataFrame([1],index=['1']).loc['2'].#key错误
&燃气轮机&燃气轮机&燃气轮机;pd.DataFrame([1],index=['1'])。loc[['1','2']]#成功,如下所示。

我想要两种方法都不失败的东西

&gt&燃气轮机&燃气轮机;pd.DataFrame([1],index=['1']).loc['2']#KeyError
&燃气轮机&燃气轮机&燃气轮机;pd.DataFrame([1],index=['1']).loc['2'].#key错误

有没有像loc这样的函数可以优雅地处理这个问题,或者用其他方式表达这个查询

更新@AlexLenail评论
这是一个公平的点,这将是缓慢的大名单。我做了一些进一步的挖掘,发现交集方法可用于索引和列。我不确定算法的复杂性,但从经验上看,它要快得多

你可以这样做

good_key=df.index.intersection(所有_key)
df.loc[好钥匙]

或者像你的例子

df=pd.DataFrame([1],index=['1'])
df.loc[df.index.intersection(['2'])]

下面是一个小实验

n=100000
#创建随机值和随机字符串索引
#让坏索引包含不在数据帧索引中的额外值
rand_val=np.random.rand(n)
兰德_idx=[]
对于范围(n)内的x:
rand_idx.append(str(x))
坏的_idx=[]
对于范围内的x(n*2):
错误的_idx.append(str(x))
df=pd.DataFrame(rand\u val,index=rand\u idx)
df.head()
def get_valid_keys_list_comp():
#使用列表理解返回筛选的数据帧以筛选关键字
vkeys=[key for key in bad_idx if key in df.index.values]
返回df.loc[vkeys]
def get_有效密钥_交叉点():
#使用list intersection()返回筛选的数据帧以筛选键
vkeys=df.index.INTERACTION(错误的idx)
返回df.loc[vkeys]
%%时间
获取有效的\u键\u交点()
#每个回路64.5 ms±4.53 ms(7次运行的平均值±标准偏差,每个10个回路)
%%时间
获取\u有效的\u密钥\u列表\u comp()
#每个回路6.14 s±457 ms(7次运行的平均值±标准偏差,每个回路1次)

原始答案

我不确定pandas是否有一个内置函数来处理这个问题,但是您可以使用Python列表理解来过滤有效的索引

给定数据帧df2

A B C D F
测试1.0 2013-01-02 1.0 3 foo
列车1.0 2013-01-02 1.0 3 foo
测试1.0 2013-01-02 1.0 3 foo
列车1.0 2013-01-02 1.0 3 foo

您可以使用此选项筛选索引查询

键=['test','train','try','fake','break']
有效的_keys=[如果在df2.index.values中输入关键字,则输入关键字对应的关键字]
df2.loc[有效的\u密钥]

如果使用df2.columns而不是df2.index.values

发表评论