按pandas中的索引列表搜索

时间:2018-05-29 19:50:14

标签: python pandas

我正在尝试以下代码:

In [29]: indexes_to_search = [1, 3, 4]

In [30]: df = pd.DataFrame([(1, 2, 3), (4, 5, 6), (7, 8, 9)], columns=["id", "val1", "val2"]).set_index("id")

In [31]: df
Out[31]: 
    val1  val2
id            
1      2     3
4      5     6
7      8     9

In [32]: df.loc[indexes_to_search]
Out[32]: 
    val1  val2
id            
1    2.0   3.0
3    NaN   NaN
4    5.0   6.0

出于某种原因,在结果中,在列中添加了3个值为NaN的索引。在我的真实问题中,indexes_to_search可以包含非索引值(在我的示例中为行3)。我想避免添加额外的行来删除我的DataFrame非常大的nan值。 所以问题是如何在没有NaN行的情况下搜索像.loc这样的索引列表。 我希望:

    val1  val2
id            
1    2.0   3.0
4    5.0   6.0

1 个答案:

答案 0 :(得分:5)

需要Index.intersection

df1 = df.loc[df.index.intersection(indexes_to_search)]
print (df1)
   val1  val2
1     2     3
4     5     6

或使用set的十字路口:

df1 = df.loc[set(df.index).intersection(indexes_to_search)]
print (df1)
    val1  val2
id            
1      2     3
4      5     6

在我的pandas版本0.22.0中收到警告:

df1 = df.loc[indexes_to_search]
print (df1)

    val1  val2
id            
1    2.0   3.0
2    NaN   NaN
3    NaN   NaN
  

FutureWarning:

     

将列表喜欢传递给.loc或[]以及任何缺少的标签将来会引发 KeyError ,您可以使用.reindex()作为替代