如何获取pandas DataFrame中不在指定索引列表内的元素?
获取不在指定索引列表中的DataFrame行
嗨,我来帮你搞定这个需求!针对你给出的示例代码,要获取不在ind(即[1,2,3])里的索引对应的DataFrame元素,有几个实用的方案,我给你详细说下:
方法1:用isin()配合取反符号~
这是最常用的布尔索引方法,思路是先判断每个索引是否在ind里,再取反得到不在列表中的索引,最后筛选行:
import pandas as pd import numpy as np A = np.linspace(10, 100, 10) A = pd.DataFrame(A, columns=["A"]) ind = [x for x in range(1, 4)] # 即[1,2,3] # 获取不在ind中的行 result = A[~A.index.isin(ind)] print(result)
解释:A.index.isin(ind)会返回一个布尔数组,标记每个索引是否属于ind;~符号会把布尔值反转,这样就得到了所有不在ind里的索引对应的布尔值,用这个数组筛选DataFrame就能得到目标行。
方法2:用drop()方法直接移除指定索引
如果你不介意创建一个新的DataFrame(或者直接修改原数据),可以用drop()方法删除ind中的索引,剩下的就是你要的内容:
# 方法2:drop移除指定索引 result = A.drop(ind) print(result)
解释:drop()方法默认按索引删除行,传入ind列表就会删除这些索引对应的行,返回剩下的部分。注意如果要直接修改原DataFrame,可以加上inplace=True参数(但一般不推荐,尽量保留原数据)。
方法3:用索引的difference()方法取差集
利用pandas索引的集合操作,直接获取原索引和ind的差集,再用loc筛选:
# 方法3:索引差集 result = A.loc[A.index.difference(ind)] print(result)
解释:A.index.difference(ind)会返回原索引中不在ind里的所有索引,然后用loc根据这些索引筛选行,逻辑非常直观。
这三种方法都能得到你想要的结果(索引0、5、6、7、8、9对应的行),你可以根据自己的代码场景选择最合适的一种~
内容的提问来源于stack exchange,提问作者hellowolrd
相关产品推荐
相关产品推荐

