我知道这是一个简单的问题,但我找不到解决的方法。
我有一个DataFrame
,我想根据另一个series
中的值删除行。
X
1 2 5 6 7 10 12 13
0 5 4 4 4 0 4 0 3
1 3 0 3 0 0 0 0 3
2 4 0 0 0 0 0 0 0
3 3 0 0 0 5 4 5 5
4 3 0 0 0 0 0 0 1
Vtk
1 4
2 3
4 3
Name: rank, dtype: int64
我想从 X 中删除与 Vtk 中值a = 3
的索引相对应的行。在这种情况下,我期望基于值2
删除索引为4
和a = 3
的 X 行。像这样:
X
1 2 5 6 7 10 12 13
0 5 4 4 4 0 4 0 3
1 3 0 3 0 0 0 0 3
3 3 0 0 0 5 4 5 5
到目前为止,我已经尝试过:
b = Vtk.isin([~a])
newX = X.loc[b]
但是有一个IndexingError:
IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match
还有其他方法可以解决我的问题吗?
答案 0 :(得分:2)
首先按Series
过滤索引值,然后按DataFrame.drop
删除行:
b = Vtk.index[Vtk == 3]
print (b)
Int64Index([2, 4], dtype='int64')
newX = X.drop(b)
print (newX)
1 2 5 6 7 10 12 13
0 5 4 4 4 0 4 0 3
1 3 0 3 0 0 0 0 3
3 3 0 0 0 5 4 5 5
另一种使用isin
和~
进行反掩码过滤的解决方案:
newX = X[~X.index.isin(b)]
print (newX)
1 2 5 6 7 10 12 13
0 5 4 4 4 0 4 0 3
1 3 0 3 0 0 0 0 3
3 3 0 0 0 5 4 5 5
通过loc
选择的解决方案是通过difference
获取索引值:
newX = X.loc[X.index.difference(b)]
print (newX)
1 2 5 6 7 10 12 13
0 5 4 4 4 0 4 0 3
1 3 0 3 0 0 0 0 3
3 3 0 0 0 5 4 5 5