我正在尝试以下代码:
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 行)。我想避免添加额外的行来删除 nan 值,因为我的 DataFrame 非常大。 所以问题是如何在没有 NaN 行的情况下按 .loc 之类的索引列表进行搜索。 我希望:
val1 val2
id
1 2.0 3.0
4 5.0 6.0
请您参考如下方法:
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:
Passing list-likes to .loc or [] with any missing label will raise KeyError in the future, you can use .reindex() as an alternative
